2016-07-23 11 views
0

私は、寄せ木のファイルから作成したDataFrameを持っています。SparkSQLを使用して更新することはできますか?

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] failure: ``with'' expected but identifier update found

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 
+0

Dataframeを直接更新できませんか?なぜSparkSQLが必要ですか? –

+0

はい、DataFrameを直接更新できます。私がSparkSQLを必要とするのは、ユーザーに良いインターフェイス、つまりSQLを提供したいからです。ユーザーがjava/scala/pythonコードを書くことはほとんどありません。だから、Spark DataFrames、RDDなどの低レベルの詳細をユーザーから隠そうと思っています。 –

答えて

2

RDDとデータフレームは不変です。したがって、DMLオプションはsparkSQLの一部として含まれていません。

1

スパークテーブルが不変なので、直接更新できません。ただし、スキーマとクエリを変更できる場合は、append-only操作を使用して同等の更新を実行できます。一般的な問題は、データウェアハウスコミュニティでType II Slowly Changing Dimensionとして知られています。これにはSpark packageがありますが、これは私が扱っていないものです。

関連する問題