python - Pandas 数据框类型 datetime64[ns] 在 Hive/Athena 中不起作用

标签 python pandas hive amazon-athena fastparquet

我正在开发一个 python 应用程序,它只是将 csv 文件转换为 hive/athena 兼容的 Parquet 格式,我正在使用 fastparquet 和 pandas 库来执行此操作。 csv文件中有时间戳值,如2018-12-21 23:45:00,需要在parquet文件中写成timestamp类型。下面是我正在运行的代码,

columnNames = ["contentid","processed_time","access_time"]

dtypes = {'contentid': 'str'}

dateCols = ['access_time', 'processed_time']

s3 = boto3.client('s3')

obj = s3.get_object(Bucket=bucketname, Key=keyname)

df = pd.read_csv(io.BytesIO(obj['Body'].read()), compression='gzip', header=0, sep=',', quotechar='"', names = columnNames, error_bad_lines=False, dtype=dtypes, parse_dates=dateCols)

s3filesys = s3fs.S3FileSystem()

myopen = s3filesys.open

write('outfile.snappy.parquet', df, compression='SNAPPY', open_with=myopen,file_scheme='hive',partition_on=PARTITION_KEYS)

代码运行成功,下面是pandas创建的dataframe

contentid                 object
processed_time            datetime64[ns]
access_time               datetime64[ns]

最后,当我在 Hive 和 athena 中查询 parquet 文件时,时间戳值是 +50942-11-30 14:00:00.000 而不是 2018-12-21 23 :45:00

非常感谢任何帮助

最佳答案

我知道这个问题很老,但它仍然相关。

如前所述,Athena 仅支持 int96 作为时间戳。 使用 fastparquet 可以为 Athena 生成格式正确的 Parquet 文件。重要的部分是 times='int96',因为它告诉 fastparquet 将 pandas datetime 转换为 int96 时间戳。

from fastparquet import write
import pandas as pd

def write_parquet():
  df = pd.read_csv('some.csv')
  write('/tmp/outfile.parquet', df, compression='GZIP', times='int96')

关于python - Pandas 数据框类型 datetime64[ns] 在 Hive/Athena 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53919763/

相关文章:

hadoop - hive 查询多次点击同一个 View ,任何最佳方式来处理这个查询

python - python lambda 和常规函数之间一定有一些区别吗?

python - 迭代数据框并检查日期

python - 如何在Python中调试: Why doesn't pdb descend into function call?

python - 插值 PANDAS df

python - 如何将数据框中的真假值转换为 1 为真,0 为假

python - 将数据从主机加载到 docker hive 容器

java - Hive 阶乘 UDF

python - 如何从被叫方的同一线路中识别多个调用者?

python - django admin static 服务于错误的 url