【发布时间】:2021-11-09 13:07:02
【问题描述】:
我有一个数据框,其中有一个名为“Query”的列,其中存在 select 语句。想要执行此查询并创建一个包含 TempView 实际结果的新列。
+--------------+-----------+-----+----------------------------------------+
|DIFFCOLUMNNAME|DATATYPE |ISSUE|QUERY |
+--------------+-----------+-----+----------------------------------------+
|Firstname |StringType |YES |Select Firstname from TempView limit 1 |
|LastName |StringType |NO |Select LastName from TempView limit 1 |
|Designation |StringType |YES |Select Designation from TempView limit 1|
|Salary |IntegerType|YES |Select Salary from TempView limit 1 |
+--------------+-----------+-----+----------------------------------------+
由于类型不匹配而出现错误,找到所需的字符串列。 我需要在这里使用UDF吗?但不确定如何编写和使用。请推荐
DF.withColumn("QueryResult", spark.sql(col("QUERY")))
TempView 是我创建的具有所有必需列的临时视图。 预期的最终 Dataframe 将是这样的,添加了新列 QUERYRESULT。
+--------------+-----------+-----+----------------------------------------+------------+
|DIFFCOLUMNNAME|DATATYPE |ISSUE|QUERY | QUERY RESULT
+--------------+-----------+-----+----------------------------------------+------------+
|Firstname |StringType |YES |Select Firstname from TempView limit 1 | Bunny |
|LastName |StringType |NO |Select LastName from TempView limit 1 | Gummy |
|Designation |StringType |YES |Select Designation from TempView limit 1| Developer |
|Salary |IntegerType|YES |Select Salary from TempView limit 1 | 100 |
+--------------+-----------+-----+----------------------------------------+------------+
【问题讨论】:
-
显示一些代码供其他人查看。不寻常的构造
-
我添加了代码,一行有 withColumn 子句。由于预期的错误是字符串和获取列
-
简短的回答是“不,你不能那样做”。您可以做的是 pasha701s 回答中说明的解决方法:收集查询,以便它们在驱动程序中可用,然后逐个执行查询。但是,当数据无论如何都需要存在于驱动程序进程中时,为什么要将查询存储在 Spark 数据帧中呢?使用案例类列表而不是 Spark 数据框来保存查询可能会更容易。
标签: scala dataframe apache-spark apache-spark-sql