【以下的问题经过翻译处理】 我正在尝试从 S3 读取数据,对其进行转换并将其插入到我在数据目录中创建的表中。
我的 ETL 作业使用 create_dynamic_frame 读取数据,转换为 Spark DataFrame,进行转换,转换回 Dynamic DataFrame,然后将该帧写入数据目录。
我像这样写入数据目录表:
DataCatalogtable_node2 = glueContext.write_dynamic_frame.from_catalog(
frame = dynamic_df,
database = db_name,
table_name = tbl_name,
transformation_ctx = "DataCatalogtable_node2",
)
我手动定义了我的数据目录表
列名 | 数据类型 |
---|
视频 | 字符串 |
阿尔蒂德 | 字符串 |
类型 | 字符串 |
时间 | 时间戳 |
时间 | 时间戳 |
价值 | 整数 |
文件名 | 字符串 |
这与我在执行写入操作之前写入的 Dynamic DataFrame 的架构相匹配
根
|-- vid: 字符串
|-- altid: 字符串
|-- vtype: 字符串
|-- 时间:时间戳
|-- timegmt: 时间戳
|-- 值:整数
|-- 文件名:字符串
当我尝试在 ETL 作业运行后查看 Athena 中的数据时,出现错误,因为存储在“时间”中的第一个值称为“time”。我的时间戳看起来像,我认为它们的格式正确。
vid、altid、vtype、时间、timegmt、值、文件名
ABC,ABC,DATAFEED,"2021-10-31 22:00:00.0","2021-11-01 02:00:00.0",11775,"s3://bpf-load-data/abc_data/lf_buf_20211101_005904.csv “
最初(在 s3 中)时间的格式为“31-10-2021 22:00:00”,因此为了使其成为 Data Catalog/Athena 用于“timestamp”的正确格式,我做了:
df = df.withColumn("时间", to_timestamp("时间", 'dd-MM-yyyy HH:mm:ss'))
我不确定这是否正确。我得到的是“2021-10-31 22:00:00.0”,而不是我怀疑的“2021-10-31 22:00:00”
无论如何,在 Athena 中,当我尝试读取该表时,“time”中的第一个数据实际上是“time”一词,因此它与timestamp不匹配,并且全部出错。
HIVE_BAD_DATA:解析字段 3 的字段值“TIME”时出错:对于输入字符串:“TIME”
这几乎就像它试图将数据帧的“标题”作为实际数据插入一样。
有谁知道会发生什么?