我正在使用spark-sql进行数据准备。
我遇到的问题是在获取sql查询的结果之后。我应该如何根据If-then-else条件更新行。
我在做什么
val table_join = sqlContext.sql(""" SELECT a.*,b.col as someCol
from table1 a LEFT JOIN table2 b
on a.ID=b.ID """)
table_join.registerTempTable("Table_join")
现在我有最终连接表格,格式为df格式。我该如何更新行?
//Final filtering operation
val final_filtered_table = table_join.map{ case record=>
if(record.getAs[String]("col1") == "Y" && record.getAs[String]("col2") == "") record.getAs[String]("col2")="UNKNOWN"
else if (record.getAs[String]("col1") == "N") record("col1")=""
else record
}
在上面的地图中,if语法正常工作,但是当我应用更新条件进行修改时,它给了我错误。
但为什么以下查询正在运作
if(record.getAs[String]("col1") == "Y" && record.getAs[String]("col2") == "") "UNKNOWN"
但是我将"UNKNOWN"
更改为record.getAs[String]("col2")="UNKNOWN"
的那一刻它在.getAs
我尝试的另一种方法是:
val final_filtered_sql = table_join.map{row =>
if(row.getString(6) == "Y" && row.getString(33) == "") row.getString(6) == "UNKNOWN"
else if(row.getString(6) == "N") row.getString(6) == ""
else row
}
这是有效的,但这是正确的方法,因为我不应该用他们的名字而不是他们的名字来调用列。我应该采用什么方法来获取列的名称,然后更新?
请帮我解决这个问题。我应该根据dataframe
spark-sql
中的条件更新行的语法
答案 0 :(得分:1)
record.getAs[String]("col2")="UNKNOWN"
无效,因为record.getAs[String](NAME)
将返回String
没有=
方法,并且为字符串分配新值不会感。
DataFrame
条记录没有任何setter方法,因为DataFrames
基于RDD
,它们是不可变的集合,这意味着您无法更改其状态,这就是您尝试执行的操作这里。
一种方法是使用DataFrame
上的selectExpr
创建新的table_join
,然后使用if/else
将SQL
逻辑放在那里。