【问题标题】:Is it possible to do an update using SparkSQL?是否可以使用 SparkSQL 进行更新?
【发布时间】:2016-07-26 03:32:15
【问题描述】:

我有一个 DataFrame,它是用 parquet 文件创建的。

val file = "/user/spark/pagecounts-20160713-150000.parquet"

val df = sqlContext.read.parquet(file)
df.registerTempTable("wikipedia")

现在我想做一个更新:

// just a dummy update statement    
val sqlDF = sqlContext.sql("update wikipedia set requests=0 where article='!K7_Records'") 

但我收到一个错误:

java.lang.RuntimeException: [1.1] 失败: ``with'' 预期但 发现标识符更新

update wikipediaEnTemp set requests=0 where article='!K7_Records'
^
  at scala.sys.package$.error(package.scala:27)
  at org.apache.spark.sql.catalyst.AbstractSparkSQLParser.parse(AbstractSparkSQLParser.scala:36)
  at org.apache.spark.sql.catalyst.DefaultParserDialect.parse(ParserDialect.scala:67)
  at org.apache.spark.sql.SQLContext$$anonfun$2.apply(SQLContext.scala:211)
  at org.apache.spark.sql.SQLContext$$anonfun$2.apply(SQLContext.scala:211)
  at org.apache.spark.sql.execution.SparkSQLParser$$anonfun$org$apache$spark$sql$execution$SparkSQLParser$$others$1.apply(SparkSQLParser.scala:114)
  at org.apache.spark.sql.execution.SparkSQLParser$$anonfun$org$apache$spark$sql$execution$SparkSQLParser$$others$1.apply(SparkSQLParser.scala:113)
  at scala.util.parsing.combinator.Parsers$Success.map(Parsers.scala:137)
  at scala.util.parsing.combinator.Parsers$Success.map(Parsers.scala:136)
  at scala.util.parsing.combinator.Parsers$Parser$$anonfun$map$1.apply(Parsers.scala:237)
  at scala.util.parsing.combinator.Parsers$Parser$$anonfun$map$1.apply(Parsers.scala:237)
  at scala.util.parsing.combinator.Parsers$$anon$3.apply(Parsers.scala:217)
  at scala.util.parsing.combinator.Parsers$Parser$$anonfun$append$1$$anonfun$apply$2.apply(Parsers.scala:249)
  at scala.util.parsing.combinator.Parsers$Parser$$anonfun$append$1$$anonfun$apply$2.apply(Parsers.scala:249)
  at scala.util.parsing.combinator.Parsers$Failure.append(Parsers.scala:197)
  at scala.util.parsing.combinator.Parsers$Parser$$anonfun$append$1.apply(Parsers.scala:249)
  at scala.util.parsing.combinator.Parsers$Parser$$anonfun$append$1.apply(Parsers.scala:249)
  at scala.util.parsing.combinator.Parsers$$anon$3.apply(Parsers.scala:217)
  at scala.util.parsing.combinator.Parsers$$anon$2$$anonfun$apply$14.apply(Parsers.scala:882)
  at scala.util.parsing.combinator.Parsers$$anon$2$$anonfun$apply$14.apply(Parsers.scala:882)
  at scala.util.DynamicVariable.withValue(DynamicVariable.scala:58)
  at scala.util.parsing.combinator.Parsers$$anon$2.apply(Parsers.scala:881)
  at scala.util.parsing.combinator.PackratParsers$$anon$1.apply(PackratParsers.scala:110)
  at org.apache.spark.sql.catalyst.AbstractSparkSQLParser.parse(AbstractSparkSQLParser.scala:34)
  at org.apache.spark.sql.SQLContext$$anonfun$1.apply(SQLContext.scala:208)
  at org.apache.spark.sql.SQLContext$$anonfun$1.apply(SQLContext.scala:208)
  at org.apache.spark.sql.execution.datasources.DDLParser.parse(DDLParser.scala:43)
  at org.apache.spark.sql.SQLContext.parseSql(SQLContext.scala:231)
  at org.apache.spark.sql.SQLContext.sql(SQLContext.scala:817)
  ... 57 elided

【问题讨论】:

  • 不能直接更新Dataframe吗?为什么需要 SparkSQL?
  • 是的,我可以直接更新DataFrame。我需要 SparkSQL 的原因是我想为用户提供他们擅长的界面,即 SQL。用户不太可能编写任何 java/scala/python 代码。所以,我想向用户隐藏低级细节,如 Spark DataFrames、RDD 等。

标签: apache-spark apache-spark-sql


【解决方案1】:

Spark 表是不可变的,因此无法直接更新。但是,如果您可以更改架构和查询,则可以使用仅追加操作执行等效的更新。一般问题在数据仓库社区中被称为Type II Slowly Changing Dimension。对此有一个Spark package,我没有使用过。

【讨论】:

    【解决方案2】:

    RDD 和 Dataframe 是不可变的,因为底层数据是不可变的。所以 DML 选项不包含在 sparkSQL 中。

    【讨论】:

      猜你喜欢
      • 2015-02-11
      • 1970-01-01
      • 2019-12-06
      • 1970-01-01
      • 2021-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多