Jay*_*Cee 10 apache-spark apache-spark-sql pyspark
我面临着一个我无法理解的奇怪问题。
我的源数据的“印象”列有时是 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
, ...
""")
Run Code Online (Sandbox Code Playgroud)
我确保所有内容都转换为 BIGINT。错误发生在稍后的步骤中:
spark.sql("CACHE TABLE adwords_ads_agg_Yxz")
Run Code Online (Sandbox Code Playgroud)
看到此错误后,我在笔记本中运行相同的代码并尝试进行更多调试,首先确保转换发生在 BIGINT / long 列上:
from pyspark.sql.types import LongType
df = df.withColumn("Impressions", f.col("Impressions").cast(LongType()))
df.createOrReplaceTempView('adwords_ads_agg_Yxz')
Run Code Online (Sandbox Code Playgroud)
然后从这个新转换的 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)
Run Code Online (Sandbox Code Playgroud)
然后进行缓存,但错误仍然存在:
Spark 作业进度 调用 o84.sql 时发生错误。:org.apache.spark.SparkException:作业因阶段失败而中止:阶段 47.0 中的任务 9 失败 4 次,最近一次失败:阶段 47.0 中丢失任务 9.3(TID 2256,ip-172-31-00-00.eu -west-1.compute.internal,执行程序 10): org.apache.spark.sql.execution.QueryExecutionException:无法在文件 s3a://bucket/prod/reports/adwords_ad/customer_id=1111111/date= 中转换 Parquet 列2019-11-21/theparquetfile.snappy.parquet。列:[展示次数],预期:bigint,发现:BINARY
有没有人遇到过这个问题和/或知道是什么原因造成的?
如果我删除缓存,则尝试将数据写入镶木地板时会发生错误。当我尝试刷新/写入临时表时,我也不知道为什么此时提到 adwords_ad 表
小智 3
当在 parquet 上使用 hive 表,然后使用 SPARK 读取它时,SPARK 采用 parquet 的模式,而不是 hive 表定义的模式。
在您的 parquet 文件中,模式 Impressions 是一个 BINARY,并且在 hive 表中它是 Long 并不重要,因为 Spark 从 parquet 文件中获取模式。
| 归档时间: |
|
| 查看次数: |
39846 次 |
| 最近记录: |