如何让 redshift 识别 parquet 文件外部表中时间戳的正确格式

问题描述 投票:0回答:1

我正在像这样转换镶木地板文件中的日期:

    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/';
amazon-redshift parquet
1个回答
0
投票

我使用预定义的架构(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
类型

© www.soinside.com 2019 - 2024. All rights reserved.