动态传递查询字符串以在PySpark数据帧方法selectExpr()中选择列

动态传递查询字符串以在PySpark数据帧方法selectExpr()中选择列,pyspark,apache-spark-sql,pyspark-sql,Pyspark,Apache Spark Sql,Pyspark Sql,我动态生成一个查询字符串,如下所示,并将其传递给selectExpr() 根据文件 选择expr(*expr): 投影一组SQL表达式并返回一个新的数据帧。 这是接受SQL表达式的select()的一个变体 问题在于变量“queryString”被视为单个字符串,而不是三个单独的列(这是正确的)。错误如下: :org.apache.spark.sql.catalyst.parser.ParseException: ==SQL== “类别id为类别id”、“类别部门id为类别dpt\U id”、

我动态生成一个查询字符串,如下所示,并将其传递给selectExpr()

根据文件

选择expr(*expr): 投影一组SQL表达式并返回一个新的数据帧。 这是接受SQL表达式的select()的一个变体

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

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

==SQL==

“类别id为类别id”、“类别部门id为类别dpt\U id”、“类别名称为类别名称”

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


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

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

如果不可能,您可以将查询字符串拆分为单独的列表达式,这些列表达式可以传递给
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|
+---+---+---+

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

如果不可能,您可以将查询字符串拆分为单独的列表达式,这些列表达式可以传递给
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|
+---+---+---+

伟大的解决方案!伟大的解决方案!