使用AWS re:Post即您表示您同意 AWS re:Post 使用条款

我正在尝试将 ETL 作业写入数据目录,但却将标题作为数据写入

0

【以下的问题经过翻译处理】 我正在尝试从 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”

这几乎就像它试图将数据帧的“标题”作为实际数据插入一样。

有谁知道会发生什么?

profile picture
专家
已提问 1 年前42 查看次数
1 回答
0

【以下的回答经过翻译处理】 我想出了解决办法。我手动创建数据目录表,需要添加表属性“skip.header.line.count = 1”。

profile picture
专家
已回答 1 年前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则