动态传递查询字符串以选择PySpark Dataframe方法selectExpr()中的列

时间:2018-10-18 13:31:09

标签: pyspark apache-spark-sql pyspark-sql

我正在按如下方式动态生成查询字符串,并将其传递给selectExpr()。

queryString=''''category_id as cat_id','category_department_id as cat_dpt_id','category_name as cat_name''''
df.selectExpr(queryString)

根据文档

selectExpr(* expr):     投影一组SQL表达式并返回一个新的DataFrame。     这是select()的变体,可以接受SQL表达式。

问题在于,变量“ queryString”被视为单个字符串,而不是三个单独的列(正确的是)。以下是错误:

  

:org.apache.spark.sql.catalyst.parser.ParseException:   .........

     

== SQL ==

     

“ category_id作为cat_id”,“ category_department_id作为cat_dpt_id”,“ category_name作为cat_name”

     

---------------------------- ^^^

有什么方法可以将动态生成的“ queryString”作为selectExpr()的参数传递。

1 个答案:

答案 0 :(得分:2)

如果可能,在生成查询字符串时,请尝试将各个列表达式立即放在列表中,而不是将它们串联成一个字符串。

如果不可能,您可以将查询字符串拆分为具有可传递给selectExpr的单独的列表达式。

# generate some dummy data
data= pd.DataFrame(np.random.randint(0, 5, size=(5, 3)), columns=list("abc"))
df = spark.createDataFrame(data)

df.show()

+---+---+---+
|  a|  b|  c|
+---+---+---+
|  1|  1|  4|
|  1|  2|  1|
|  3|  3|  2|
|  3|  2|  2|
|  2|  0|  2|
+---+---+---+

# create example query string
query_string="'a as aa','b as bb','c as cc'"

# split and pass
column_expr = query_string.replace("'", "").split(",")

df.selectExpr(column_expr).show()

+---+---+---+
| aa| bb| cc|
+---+---+---+
|  1|  1|  4|
|  1|  2|  1|
|  3|  3|  2|
|  3|  2|  2|
|  2|  0|  2|
+---+---+---+