如何更新数据集中的值?

时间:2017-08-08 19:42:27

标签: apache-spark apache-spark-sql

据我所知,Apache Spark没有模仿 更新 SQL命令的功能。就像,我可以在给定特定条件的情况下更改列中的单个值。唯一的方法是使用我被指示使用的以下命令(在Stackoverflow中):withColumn(columnName, where('condition', value));

但是,条件应该是column类型,这意味着我必须使用apache具有的内置列过滤函数(equalToisinlt,{ {1}}等)。有没有办法可以改为使用SQL语句而不是内置函数?

问题是我给出了带有SQL语句的文本文件,例如gtWHERE ID > 5等。然后我必须根据这些条件标记值,我想到了以下WHERE AGE != 50方法,但我不能在该函数中插入SQL语句。知道如何解决这个问题吗?

4 个答案:

答案 0 :(得分:1)

我找到了解决这个问题的方法:

您希望将数据集拆分为两组:您要更新的值和您不想更新的值

Vendor

然而,这与原始数据集保持相同的记录顺序,因此如果订单对您来说很重要,那么这不足以满足您的需求。

在PySpark中,您必须使用.subtract而不是.except

答案 1 :(得分:0)

如果您使用的是DataFrame,则可以将该数据帧注册为临时表, 使用df.registerTempTable(“events”)

然后你可以查询, sqlContext.sql(“SELECT * FROM events”+)

答案 2 :(得分:0)

when 子句转换为 case clause ,您可以将其与SQL案例子句相关联。

示例

scala> val condition_1 = when(col("col_1").isNull,"NA").otherwise("AVAILABLE")
condition_1: org.apache.spark.sql.Column = CASE WHEN (col_1 IS NULL) THEN NA ELSE AVAILABLE END

或者您也可以链接 when 子句

scala> val condition_2 = when(col("col_1") === col("col_2"),"EQUAL").when(col("col_1") > col("col_2"),"GREATER").
     | otherwise("LESS")
condition_2: org.apache.spark.sql.Column = CASE WHEN (col_1 = col_2) THEN EQUAL WHEN (col_1 > col_2) THEN GREATER ELSE LESS END

scala> val new_df = df.withColumn("condition_1",condition_1).withColumn("condition_2",condition_2)

如果您想使用表格,那么您可以将数据框/数据集注册为临时表并执行SQL查询

df.createOrReplaceTempView("tempTable")//spark 2.1 +
df.registerTempTable("tempTable")//spark 1.6

现在,您可以执行SQL查询

spark.sql("your queries goes here with case clause and where condition!!!")//spark 2.1
sqlContest.sql("your queries goes here with case clause and where condition!!!")//spark 1.6

答案 3 :(得分:0)

如果您使用的是Java数据集 您可以在下面更新数据集。 这是代码

数据集ratesFinal1 = ratesFinal.filter(“ on_behalf_of_comp_id!='COMM_DERIVS'”);

ratesFinal1 = ratesFinal1.filter(“ status!='Hit / Lift'”);

数据集ratesFinalSwap = ratesFinal1.filter(“('SAPPHIRE','BOND')中的on_behalf_of_comp_id和cash_derivative!='cash'”);

ratesFinalSwap = ratesFinalSwap.withColumn(“ ins_type_str”,functions.lit(“ SWAP”));

使用现有列中的值添加新列

ratesFinalSTW = ratesFinalSTW.withColumn(“ action”,ratesFinalSTW.col(“ status”));