gpt4 book ai didi

python - 如果列数不同,如何处理从源 Spark df 到 Hive 表的插入

转载 作者:行者123 更新时间:2023-12-01 01:56:57 30 4
gpt4 key购买 nike

我正在尝试将 pyspark 数据帧写入 hive 表,但由于我的源 df 只有 5 列,而目标有 9 列,因此会导致错误。

此外,由于存在多种情况,我不想构建可以解决此问题的手动插入查询。我正在寻找一种更好的自动化方法来处理这个问题,而无需为每种情况手动编写查询。

我想通过获取源 df 和目标表中存在但源 df 中不存在的额外列来在 Spark 中创建一个新的 df,但它并不像我想象的那样工作。

这是我正在处理的代码

#extract cols from src df and tgt df(hive table) 
src_cols = df1.columns
tgt_cols = df2.columns

#get the extra cols (diff)
extra_cols = list(set(tgt_cols) - set(src_cols))
#extra_cols = ['state', 'datetime', 'zipcode', 'type']

#formulate the string to add extra cols
string = ""
for item in extra_cols:
string += str(".withColumn(\""+item+"\", lit(\"NULL\"))")

这将打印出我可以用于新 df 的所需字符串

#'.withColumn("state", lit(NULL)).withColumn("datetime", lit(NULL)).withColumn("zipcode", lit(NULL)).withColumn("type", lit(NULL))'


new_df = "df1" + string
#'df1.withColumn("state", lit("NULL")).withColumn("datetime", lit("NULL")).withColumn("zipcode", lit("NULL")).withColumn("type", lit("NULL"))'

现在的问题是我无法执行代码df1.withColumn("state", lit("NULL")).withColumn("datetime", lit("NULL")).withColumn( "zipcode", lit("NULL")).withColumn("type", lit("NULL")) 因为它是一个字符串

任何人都可以帮助我以更好的方式处理这种情况。

谢谢。

最佳答案

如果您已将列名称中的差异列表标识为

#extra_cols = ['state', 'datetime', 'zipcode', 'type']

那么你不需要制定字符串来添加额外的列,你可以简单地使用reduce函数来应用.withColumn列名称列表为

import pyspark.sql.functions as f
to_be_written_df = reduce(lambda temp_df, col_name: temp_df.withColumn(col_name, f.lit('NULL')), extra_cols, df1)

这应该可以解决你的问题

关于python - 如果列数不同,如何处理从源 Spark df 到 Hive 表的插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50055916/

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