【问题标题】:AnalysisException, pyspark cannot resolve variables inside dataframe queryAnalysisException,pyspark 无法解析数据框查询中的变量
【发布时间】: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

标签: python pyspark pyspark-sql pyspark-dataframes


【解决方案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 。如果我通过直接创建如上所述的变量来执行它,它可以工作..但是当它从循环中选择值时它会失败。但两个值保持不变。
猜你喜欢
  • 1970-01-01
  • 2018-07-11
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-05
相关资源
最近更新 更多