AnalysisException,pyspark 无法解析数据框查询中的变量
Posted
技术标签:
【中文标题】AnalysisException,pyspark 无法解析数据框查询中的变量【英文标题】:AnalysisException, pyspark cannot resolve variables inside dataframe query 【发布时间】:2019-09-17 11:59:27 【问题描述】:我这里有一个 pyspark 脚本行,
df_output = df.select("*",$checkcol)
df_output.show()
通过硬编码变量可以正常工作, 但是当参数化时,它会抛出一个错误,
pyspark.sql.utils.AnalysisException: '无法解析\'`"*", F.....
其中checkcol
是一个变量,其值如下所示,
checkcol -
F.when(F.col("colA")=='null',"Yes").otherwise(date_validation_udf("colA")).alias("colA_DateCheck"),
F.when(F.col("colB")=='null',"Yes").otherwise(date_validation_udf("colB")).alias("colB_DateCheck"),F.when(F.col("colC")=='null',"Yes").otherwise(date_validation_udf("colC")).alias("colC_DateCheck"),
F.when(F.col("colD")=='null',"Yes").otherwise(num_check_udf("colD")).alias("colD_NumCheck"),F.when(F.col("colE")=='null',"Yes").otherwise(num_check_udf("colE")).alias("colE_NumCheck"),
F.when(F.col("colF")=='null',"Yes").otherwise(num_check_udf("colF")).alias("colF_NumCheck"),F.when(F.col("colG")=='null',"Yes").otherwise(num_check_udf("colG")).alias("colG_NumCheck")
【问题讨论】:
$checkcol
的语法是什么?是壳吗?
需要在 pyspark 脚本中执行它..通过在其中调用该变量..
$
语法不是 python。假设checkcol
是list
,我认为你所追求的是df_output = df.select(*[df.columns + checkcol])
不是字符串.. df_w_output = df.select(*[df.columns + CheckCol]) TypeError: can only concatenate list (not "str") to list
【参考方案1】:
试试这个:
import pyspark.sql.functions as F
df_output = df.withColumn("colA",
F.when(F.col("colA")=='null',"Yes").otherwise(date_validation_udf("colA")).alias("colA_DateCheck"))
.withColumn("colB",
F.when(F.col("colB")=='null',"Yes").otherwise(date_validation_udf("colB")).alias("colB_DateCheck"),F.when(F.col("colC")=='null',"Yes").otherwise(date_validation_udf("colC")).alias("colC_DateCheck"),)
...
df_output.show()
编辑:
要将这些语句作为一个变量传递给选择,试试这个:
checkcol = (F.when(F.col("colA") == 'null', "Yes").otherwise(date_validation_udf("colA")).alias("colA_DateCheck"),
F.when(F.col("colB") == 'null', "Yes").otherwise(date_validation_udf("colB")).alias("colB_DateCheck"),
F.when(F.col("colC") == 'null', "Yes").otherwise(date_validation_udf("colC")).alias("colC_DateCheck"),
F.when(F.col("colD") == 'null', "Yes").otherwise(num_check_udf("colD")).alias("colD_NumCheck"),
F.when(F.col("colE") == 'null', "Yes").otherwise(num_check_udf("colE")).alias("colE_NumCheck"),
F.when(F.col("colF") == 'null', "Yes").otherwise(num_check_udf("colF")).alias("colF_NumCheck"),
F.when(F.col("colG") == 'null', "Yes").otherwise(num_check_udf("colG")).alias("colG_NumCheck"))
df_output = df.select(
'*',
*checkcol
)
【讨论】:
嗨,直接硬编码它可以正常工作。但我想将这些语句作为变量传递给它。 嗨@Amine,仍然出现类似 df_w_output = df.select( '*',*CheckCol) py4j.protocol.Py4JJavaError: An error occurred while calling z:org.apache.spark.sql .functions.col。 :java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-1 嗨@Amine,实际上我通过附加它从for循环中获取checkcol值..比如,for i,j in zip(date_data,range(Date_Count)): if j==(Date_Count -1): 检查='F.when(F.col("'+i+'")=='+"'null',"+'"是").otherwise(date_validation_udf("'+i+'") ).alias("'+i+'_DateCheck")' else: Check='F.when(F.col("'+i+'")=='+"'null',"+'"Yes")。否则(date_validation_udf("'+i+'")).alias("'+i+'_DateCheck"),' CheckCol+=Check 。如果我通过直接创建如上所述的变量来执行它,它可以工作..但是当它从循环中选择值时它会失败。但两个值保持不变。以上是关于AnalysisException,pyspark 无法解析数据框查询中的变量的主要内容,如果未能解决你的问题,请参考以下文章
pyspark.sql.utils.AnalysisException:找不到数据源:kafka
PySpark AnalysisException:无法解析列名
Pyspark 从 S3 存储桶读取 csv 文件:AnalysisException:路径不存在
pyspark.sql.utils.AnalysisException:参考“标题”不明确,可能是:标题,标题
发生异常:pyspark.sql.utils.AnalysisException '必须使用 writeStream.start();;\nkafka' 执行带有流式源的查询
pyspark.sql.utils.AnalysisException:u'无法推断Parquet的模式。必须手动指定。