Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 如何更新数据集中的值?_Apache Spark_Apache Spark Sql - Fatal编程技术网

Apache spark 如何更新数据集中的值?

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

据我所知,apachespark没有模仿updateSQL命令的功能。比如,在给定特定条件的情况下,我可以更改列中的单个值。唯一的解决方法是使用以下命令(在Stackoverflow中):
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语句。一旦根据输入条件获得过滤后的数据帧,您可以使用数据帧中的更新值创建一个新列。