2016-04-26 3 views
1

Это продолжение к Save Spark dataframe as dynamic partitioned table in Hive. Я пытался использовать предложения в ответах, но не смог заставить его работать в Spark 1.6.1Искры разделов: создание разделов RDD, но не разделов Hive

Я пытаюсь создать разделы программно из `DataFrame. Вот соответствующий код (адаптировано из теста Спарк):

hc.setConf("hive.metastore.warehouse.dir", "tmp/tests") 
// hc.setConf("hive.exec.dynamic.partition", "true") 
// hc.setConf("hive.exec.dynamic.partition.mode", "nonstrict") 
hc.sql("create database if not exists tmp") 
hc.sql("drop table if exists tmp.partitiontest1") 

Seq(2012 -> "a").toDF("year", "val") 
    .write 
    .partitionBy("year") 
    .mode(SaveMode.Append) 
    .saveAsTable("tmp.partitiontest1") 
hc.sql("show partitions tmp.partitiontest1").show 

Полный файл здесь: https://gist.github.com/SashaOv/7c65f03a51c7e8f9c9e018cd42aa4c4a

Многораздельные файлы создаются штраф в файловой системе, но улей жалуется, что таблица не разбита на разделы:

====================== 
HIVE FAILURE OUTPUT 
====================== 
SET hive.support.sql11.reserved.keywords=false 
SET hive.metastore.warehouse.dir=tmp/tests 
OK 
OK 
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Table tmp.partitiontest1 is not a partitioned table 
====================== 

Похоже, что основная причина заключается в том, что org.apache.spark.sql.hive.HiveMetastoreCatalog.newSparkSQLSpecificMetastoreTable всегда создает таблицу с пустыми разделами.

Любая помощь для перемещения вперед.

EDIT: также создал SPARK-14927

ответ

1

Я нашел обходной путь: если вы предварительно создать таблицу, то saveAsTable() не будет связываться с ним. Так следующие работы:

hc.setConf("hive.metastore.warehouse.dir", "tmp/tests") 
// hc.setConf("hive.exec.dynamic.partition", "true") 
// hc.setConf("hive.exec.dynamic.partition.mode", "nonstrict") 
hc.sql("create database if not exists tmp") 
hc.sql("drop table if exists tmp.partitiontest1") 

// Added line: 
hc.sql("create table tmp.partitiontest1(val string) partitioned by (year int)") 


Seq(2012 -> "a").toDF("year", "val") 
    .write 
    .partitionBy("year") 
    .mode(SaveMode.Append) 
    .saveAsTable("tmp.partitiontest1") 
hc.sql("show partitions tmp.partitiontest1").show 

Это решение работает в 1.6.1, но не в 1.5.1