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。假设checkcollist,我认为你所追求的是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的模式。必须手动指定。