我正在尝试将 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
EXPERTE
gefragt vor 5 Monaten28 Aufrufe
1 Antwort
0

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

profile picture
EXPERTE
beantwortet vor 5 Monaten

Du bist nicht angemeldet. Anmelden um eine Antwort zu veröffentlichen.

Eine gute Antwort beantwortet die Frage klar, gibt konstruktives Feedback und fördert die berufliche Weiterentwicklung des Fragenstellers.

Richtlinien für die Beantwortung von Fragen