我试图将来自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配置时,它可以正常工作。但是,使用分区表...它给我这个错误。
我还尝试将数据帧注册为临时表,然后将该表写入分区表。这样做也给了我同样的错误
有人可以告诉我该如何解决。 感谢。
答案 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")