【发布时间】:2019-05-23 23:46:39
【问题描述】:
我正在开发一个 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
非常感谢任何帮助
【问题讨论】:
-
尝试在 hive 中插入时将列转换为数据时间格式 pd.to_datetime(df['access_time', 'processed_time'], unit='ms', errors='coerce')
-
也试过了。但还是一样
-
在创建 DF 时不要解析列,而是转换为 datetime 对象为 datetime.datetime.strptime('2018-12-21 23:45:00','%y-%m-% d %H:%m') 并应用于 df 的日期列。
-
如果 Athena/Hive 不直接支持,您可能需要使用此处 prestodb.io/docs/current/functions/datetime.html 中的函数,具体取决于您的 python 脚本生成的格式。使用“parquet-tools cat”检查架构的数据和架构。如果您无法找到正确的转换函数,请在此处发布时间戳格式。
-
这些答案是否有帮助,我遇到了完全相同的问题?
标签: python pandas hive amazon-athena fastparquet