将数据帧存储到spark

时间:2016-10-19 04:33:49

标签: hadoop hive spark-streaming

我试图将来自kafka主题的数据流存储到hive分区表中。我能够将dstream转换为数据帧并创建了一个hive上下文。我的代码看起来像这样

val hiveContext = new HiveContext(sc)
hiveContext.setConf("hive.exec.dynamic.partition", "true")
hiveContext.setConf("hive.exec.dynamic.partition.mode", "nonstrict")
newdf.registerTempTable("temp") //newdf is my dataframe
newdf.write.mode(SaveMode.Append).format("osv").partitionBy("date").saveAsTable("mytablename")

但是当我在群集上部署应用程序时,它会说

Exception in thread "main" java.lang.IllegalArgumentException: Wrong FS: file:/tmp/spark-3f00838b-c5d9-4a9a-9818-11fbb0007076/scratch_hive_2016-10-18_23-18-33_118_769650074381029645-1, expected: hdfs://

当我尝试将其保存为普通表并注释掉hive配置时,它可以正常工作。但是,使用分区表...它给我这个错误。

我还尝试将数据帧注册为临时表,然后将该表写入分区表。这样做也给了我同样的错误

有人可以告诉我该如何解决。 感谢。

3 个答案:

答案 0 :(得分:0)

  

如果要部署应用程序,则需要使用hadoop(hdfs)   在群集上。

使用saveAsTable时,Spark保存的默认位置由HiveMetastore控制(基于文档)。另一个选择是使用saveAsParquetFile并指定路径,然后稍后使用您的hive Metastore注册该路径或使用新的DataFrameWriter接口并指定路径选项write.format(source).mode(mode).options(options).saveAsTable(tableName).

答案 1 :(得分:0)

我明白了。 在spark app的代码中,我将scratch dir位置声明如下,并且它有效。

sqlContext.sql("SET hive.exec.scratchdir=<hdfs location>")

答案 2 :(得分:0)

sqlContext.sql("SET hive.exec.scratchdir=location")