我正在像这样转换镶木地板文件中的日期:
timestamp_column = next((col for col in df.columns if 'timestamp' in col), None)
if timestamp_column:
# Convert epoch to datetime
df[key.split('/')[0] + '_' + key.split('/')[1][:-1] + '_timestamp'] = pd.to_datetime(df[timestamp_column], unit='s')
尽管我没有看到数据类型,但镶木地板文件中的时间戳看起来不错:
hash number \
0 0xe0594250efac73640aeff78ec40aaaaa87f91edb54e5... 1
arbitrum_block_timestamp
0 2021-05-28 23:09:04 ...
因此,我创建了一个带有时间戳的外部表,但是当我选择它时,它不喜欢时间戳中只有秒,我认为它期望格式为“2021-05-28 23:09:04.123456”,其中包含微秒。所以它把日期放在未来的位置:
dev=# select arbitrum_block_timestamp from arbitrum_schema.processed_arbitrum_blocks limit 5;
arbitrum_block_timestamp
------------------------------
283525-04-29 11:22:00.358354
285180-04-08 11:48:40.358354
283523-07-21 07:48:40.358354
285188-05-31 00:42:00.358354
283157-09-26 05:08:40.358354
(5 rows)
使用 COPY 有像
TIMEFORMAT AS 'xx..'
这样的选项,但我不知道如何在表创建中执行此操作:
CREATE EXTERNAL TABLE arbitrum_schema.processed_arbitrum_blocks(
...
arbitrum_block_timestamp TIMESTAMP
)
STORED AS PARQUET
LOCATION 's3://bloc...ocks/';
我使用预定义的架构(pyarrow)来保存 pandas 数据帧。没有它,我找不到解决方案。
df.created_at = pd.to_datetime(df.created_at, errors='coerce')
schema = pa.schema([
('created_at', pa.timestamp('s'),
other_columns
])
df.to_parquet(schema=schema)
在创建表格时,我使用了
timestamp
类型