AWS - Redshift - 外部表读取 Parquet 文件中 timestamp 类型的数据

ops/2025/2/25 13:52:02/

问题:

通过 Redshift Spectrum 功能可以读取 S3 中的文件,当读取 Parquet 文件时,如果列格式设置为 timestamp, 通过 psql 客户端读取会出现以下错误:

testdb=# select * from myspectrum_schema_0219.test_ns;
ERROR:  Assert
DETAIL:-----------------------------------------------error:  Assertcode:      1000context:   status == 0 - timestamp: '-3784992261051417264'query:     15121995location:  cg_util.cpp:705process:   padbmaster [pid=1073963104]-----------------------------------------------

通过 Query Editor V2 读取,则显示错误的时间格式:

以下是 CSV 文件,以及通过 python 读取 Parquet 文件的内容:

CSV:

$ more data3.csv
saletime
2024-01-01 01:01:01.000000
2025-01-01 01:01:01.000000
2025-01-02 02:01:01.000000
2025-01-03 03:01:01.000000
2025-01-04 04:01:01.000000
2025-01-04 05:01:01.000000

Parquet:

>>> import pandas as pd
>>> import pyarrow.parquet as pq
>>> parquet_file = 'data3_ns.parquet'
>>> df_read = pd.read_parquet(parquet_file)
>>> print(df_read)saletime
0 2024-01-01 01:01:01
1 2025-01-01 01:01:01
2 2025-01-02 02:01:01
3 2025-01-03 03:01:01
4 2025-01-04 04:01:01
5 2025-01-04 05:01:01

原因:

Redshift 中的时间类型支持到 us,也就是 微妙,而 Parquet 文件 timestamp 格式支持的类型为 ns,所以对于时间格式是无法读取,或读取错误。

解决:

在 Parquet 文件设置时间类型时,对值做设置,datetime64[us],以匹配 Redshift 的时间精度。

以下为CSV生成 Parquet 的代码:

import pandas as pd
import pyarrow.parquet as pq# 读取 CSV 文件
csv_file = 'data3.csv'
df = pd.read_csv(csv_file)# 假设 CSV 文件中有一个时间列 'timestamp',将其转换为微秒精度
df['saletime'] = pd.to_datetime(df['saletime']).astype('datetime64[us]')# 将 DataFrame 保存为 Parquet 文件
parquet_file = 'data3_us.parquet'
df.to_parquet(parquet_file, engine='pyarrow')# 读取 Parquet 文件以验证
df_read = pd.read_parquet(parquet_file)
print(df_read)saletime
0 2024-01-01 01:01:01
1 2025-01-01 01:01:01
2 2025-01-02 02:01:01
3 2025-01-03 03:01:01
4 2025-01-04 04:01:01
5 2025-01-04 05:01:01

之后创建外部表进行查询,就可以成功匹配到正确的格式。

testdb=# CREATE EXTERNAL TABLE myspectrum_schema_0219.test_us(saletime timestamp)
testdb-# STORED AS parquet
testdb-# LOCATION 's3://XXX/redshiftspectrum/t_0220_p/t_0220_p_us/';
CREATE EXTERNAL TABLEtestdb=# select * from myspectrum_schema_0219.test_us;saletime
---------------------2024-01-01 01:01:012025-01-01 01:01:012025-01-02 02:01:012025-01-03 03:01:012025-01-04 04:01:012025-01-04 05:01:01
(6 rows)


http://www.ppmy.cn/ops/161213.html

相关文章

如何安装vm和centos

一、安装VMware虚拟机 1. **下载VMware Workstation Pro**: - 访问VMware官网,找到下载页面,选择适合您操作系统的版本进行下载。 2. **安装VMware Workstation Pro**: - 打开下载好的安装包,点击“下一步”。 …

《机器学习数学基础》补充资料:欧几里得空间的推广

在《机器学习数学基础》第 1 章介绍了向量空间,并且说明了机器学习问题通常是在欧几里得空间。然而,随着机器学习技术的发展,特别是 AI 技术开始应用于科学研究中,必然会涉及到其他类型的空间。本文即在《机器学习数学基础》一书所…

深入剖析:基于红黑树实现自定义 map 和 set 容器

🌟 快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。🌟 在 C 标准模板库(STL)的大家庭里,map和set可是超级重要的关联容器成员呢😎&#x…

GAMES104:18 网络游戏的架构基础-学习笔记

文章目录 课前QA一,网络协议Network Protocols1.0 Socket1.1 传输控制协议TCP(Transmission Control Protocol)1.2 用户数据报协议UDP(User Datagram Protocol)1.3 Reliable UDP1.3.1 自动重传请求ARQ(Automatic Repeat Request)1.3.1.1 滑窗…

华为昇腾910b服务器部署DeepSeek翻车现场

最近到祸一台HUAWEI Kunpeng 920 5250,先看看配置。之前是部署的讯飞大模型,发现资源利用率太低了。把5台减少到3台,就出了他 硬件配置信息 基本硬件信息 按照惯例先来看看配置。一共3块盘,500G的系统盘, 2块3T固态…

Maven——Maven开发经验总结(1)

摘要 本文总结了 Maven 开发中的多个关键经验,包括如何根据版本号决定推送到 releases 或 snapshots 仓库,如何在构建过程中跳过测试,父项目如何控制子项目依赖版本,父项目依赖是否能传递到子项目,如何跳过 Maven dep…

自定义SpringBoot Starter

✅自定义SpringBoot Starter SpringBoot 的 starter 可以帮我们简化配置,非常的方便,定义起来其实也不复杂,我的项目中定义了很多 starter,比如business-job就是一个 stater,以他为例,介绍下如何定义 star…

《炒股养家心法.pdf》 kimi总结

《炒股养家心法.pdf》这篇文章详细阐述了一位超级游资炒股养家的心得与技巧,展示了其从40万到10亿的股市传奇。以下是文章中炒股技巧和心得的详细总结: 1.核心理念 市场情绪的理解:炒股养家强调,股市的本质是群体博弈&#xff0c…