Apache spark 如何更新数据集中的值?
据我所知,apachespark没有模仿updateSQL命令的功能。比如,在给定特定条件的情况下,我可以更改列中的单个值。唯一的解决方法是使用以下命令(在Stackoverflow中):Apache spark 如何更新数据集中的值?,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,据我所知,apachespark没有模仿updateSQL命令的功能。比如,在给定特定条件的情况下,我可以更改列中的单个值。唯一的解决方法是使用以下命令(在Stackoverflow中):withColumn(columnName,其中('condition',value)) 但是,条件应该是列类型,这意味着我必须使用apache的内置列过滤功能(equalTo,isin,lt,gt,等等)。有没有办法用SQL语句代替那些内置函数 问题是我得到了一个包含SQL语句的文本文件,比如WHERE ID
withColumn(columnName,其中('condition',value))代码>
但是,条件应该是列
类型,这意味着我必须使用apache的内置列过滤功能(equalTo
,isin
,lt
,gt
,等等)。有没有办法用SQL语句代替那些内置函数
问题是我得到了一个包含SQL语句的文本文件,比如WHERE ID>5
或WHERE AGE!=50
,等等。然后我必须根据这些条件标记值,我想采用with column()
方法,但我不能在该函数中插入SQL语句。你知道我该怎么做吗 如果您使用的是数据帧,则可以将该数据帧注册为临时表,
使用df.RegisterEmptable(“事件”)
然后你可以这样查询,
sqlContext.sql(“SELECT*FROM events”+)当
子句转换为可以与sql case子句相关的case子句时
示例
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
或者也可以在
子句时链接
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
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
现在,您可以执行sql查询了
df.createOrReplaceTempView("tempTable")//spark 2.1 +
df.registerTempTable("tempTable")//spark 1.6
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
我找到了解决这个问题的方法:
您希望将数据集分为两组:要更新的值和不想更新的值
Dataset<Row> valuesToUpdate = dataset.filter('conditionToFilterValues');
Dataset<Row> valuesNotToUpdate = dataset.except(valuesToUpdate);
valueToUpdate = valueToUpdate.withColumn('updatedColumn', lit('updateValue'));
Dataset<Row> updatedDataset = valuesNotToUpdate.union(valueToUpdate);
Dataset valuesToUpdate=Dataset.filter('conditionToFilterValues');
Dataset ValuesNotUpdate=Dataset.Exception(valuesToUpdate);
valueToUpdate=valueToUpdate.withColumn('UpdateColumn',lit('updateValue');
Dataset updatedDataset=ValuesNotUpdate.union(valueToUpdate);
然而,这并没有保持与原始数据集相同的记录顺序,因此,如果顺序对您很重要,这将不能满足您的需要
在PySpark中,您必须使用.subtract而不是.except,除非您使用的是java数据集
您可以通过以下方式更新数据集。
这是密码
数据集ratesFinal1=ratesFinal.filter(“代表公司id!='COMM\u DERIVS'”)
ratesFinal1=ratesFinal1.filter(“状态!=‘命中/抬起’”)
数据集ratesFinalSwap=ratesFinal1.filter(“代表公司(‘蓝宝石’、‘债券’)和现金衍生品!=‘现金’”)
ratesFinalSwap=ratesFinalSwap.withColumn(“ins_type_str”,functions.lit(“SWAP”)
使用现有列中的值添加新列
ratesFinalSTW=带有列的ratesFinalSTW.(“操作”,ratesFinalSTW.列(“状态”) 但是我仍然无法更新数据集,因为spark不接受update语句。一旦根据输入条件获得过滤后的数据帧,您可以使用数据帧中的更新值创建一个新列。