如何根据spark-sql中的条件更新行

时间:2015-08-12 02:53:40

标签: scala apache-spark-sql

我正在使用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中的条件更新行的语法

1 个答案:

答案 0 :(得分:1)

record.getAs[String]("col2")="UNKNOWN"无效,因为record.getAs[String](NAME)将返回String没有=方法,并且为字符串分配新值不会感。

DataFrame条记录没有任何setter方法,因为DataFrames基于RDD,它们是不可变的集合,这意味着您无法更改其状态,这就是您尝试执行的操作这里。

一种方法是使用DataFrame上的selectExpr创建新的table_join,然后使用if/elseSQL逻辑放在那里。