gpt4 book ai didi

apache-spark - spark 2.4 Parquet 列无法在文件中转换,列 : [Impressions], 预期为 : bigint, 发现:BINARY

转载 作者:行者123 更新时间:2023-12-04 04:21:38 24 4
gpt4 key购买 nike

我正面临一个我无法理解的奇怪问题。

我有一个带有“印象”列的源数据,它有时是一个 bigint/有时是一个字符串(当我手动浏览数据时)。

为该列注册的 HIVE 模式为 Long。

因此,在加载数据时:

spark.sql("""
CREATE OR REPLACE TEMPORARY VIEW adwords_ads_agg_Yxz AS

SELECT
a.customer_id
, a.Campaign
, ...
, SUM(BIGINT(a.Impressions)) as Impressions
, SUM(BIGINT(a.Cost))/1000000 as Cost
FROM adwords_ad a
LEFT JOIN ds_ad_mapping m ON BIGINT(a.Ad_ID) = BIGINT(m.adEngineId) AND a.customer_id = m.reportAccountId
WHERE a.customer_id in (...)
AND a.day >= DATE('2019-02-01')
GROUP BY
a.customer_id
, ...
""")

我确保所有内容都转换为 BIGINT。
错误发生在稍后的步骤中:
spark.sql("CACHE TABLE adwords_ads_agg_Yxz")

看到此错误后,我在笔记本中运行了相同的代码并尝试进行更多调试,首先确保转换发生在 BIGINT/long 列上:
from pyspark.sql.types import LongType

df = df.withColumn("Impressions", f.col("Impressions").cast(LongType()))
df.createOrReplaceTempView('adwords_ads_agg_Yxz')


然后从这个新转换的 df 打印模式:
root
|-- customer_id: long (nullable = true)
|-- Campaign: string (nullable = true)
|-- MatchType: string (nullable = true)
|-- League: string (nullable = false)
|-- Ad_Group: string (nullable = true)
|-- Impressions: long (nullable = true) <- Here!
|-- Cost: double (nullable = true)

然后进行缓存,但错误仍然存​​在:

Spark Job Progress An error occurred while calling o84.sql. : org.apache.spark.SparkException: Job aborted due to stage failure: Task 9 in stage 47.0 failed 4 times, most recent failure: Lost task 9.3 in stage 47.0 (TID 2256, ip-172-31-00-00.eu-west-1.compute.internal, executor 10): org.apache.spark.sql.execution.QueryExecutionException: Parquet column cannot be converted in file s3a://bucket/prod/reports/adwords_ad/customer_id=1111111/date=2019-11-21/theparquetfile.snappy.parquet. Column: [Impressions], Expected: bigint, Found: BINARY



有没有人遇到过这个问题和/或会知道是什么导致了这个问题?

如果我删除缓存,则在尝试将数据写入 parquet 时会发生错误。
当我尝试刷新/编写临时表时,我也不知道为什么此时提到 adwords_ad 表

最佳答案

在 Parquet 上使用 hive table 时,
然后使用 SPARK 读取它,
SPARK 采用 Parquet 的架构,而不是配置单元表的定义。

在您的 Parquet 文件中,架构印象是一个二进制文件是有道理的,并且在 hive 表中它的 Long 无关紧要,因为 spark 从 Parquet 文件中获取架构。

关于apache-spark - spark 2.4 Parquet 列无法在文件中转换,列 : [Impressions], 预期为 : bigint, 发现:BINARY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59096125/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com