据我所知,Apache Spark没有模仿 更新 SQL命令的功能。就像,我可以在给定特定条件的情况下更改列中的单个值。唯一的方法是使用我被指示使用的以下命令(在Stackoverflow中):withColumn(columnName, where('condition', value));
但是,条件应该是column
类型,这意味着我必须使用apache具有的内置列过滤函数(equalTo
,isin
,lt
,{ {1}}等)。有没有办法可以改为使用SQL语句而不是内置函数?
问题是我给出了带有SQL语句的文本文件,例如gt
或WHERE ID > 5
等。然后我必须根据这些条件标记值,我想到了以下WHERE AGE != 50
方法,但我不能在该函数中插入SQL语句。知道如何解决这个问题吗?
答案 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”));