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

san*_*mar 1 apache-spark-sql pyspark

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

queryString=''''category_id as cat_id','category_department_id as cat_dpt_id','category_name as cat_name''''
df.selectExpr(queryString)
Run Code Online (Sandbox Code Playgroud)

根据文件

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() 的参数传递。

pan*_*sen 5

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

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