it-swarm.com.ru

Сохранить Spark DataFrame как динамическую многораздельную таблицу в Hive

У меня есть пример приложения, работающего для чтения из CSV-файлов в кадре данных. Кадр данных можно сохранить в таблице Hive в формате паркета с помощью метода df.saveAsTable(tablename,mode)

Приведенный выше код работает нормально, но у меня есть так много данных за каждый день, что я хочу динамически разбивать таблицу Hive на основе даты создания (столбец в таблице).

есть ли способ динамического разделения данных и сохранения их в хранилище Hive. Хотите воздержаться от жесткого кодирования оператора вставки, используя hivesqlcontext.sql(insert into table partittioin by(date)....).

Вопрос можно рассматривать как расширение для: Как сохранить DataFrame непосредственно в Hive?

буду признателен за любую оказанную помощь.

23
Chetandalal

Я считаю, что это работает примерно так:

df - это датафрейм с годом, месяцем и другими столбцами

df.write.partitionBy('year', 'month').saveAsTable(...)

или же

df.write.partitionBy('year', 'month').insertInto(...)
20
mdurant

Мне удалось записать в разделенную таблицу Hive с помощью df.write().mode(SaveMode.Append).partitionBy("colname").saveAsTable("Table")

Мне пришлось включить следующие свойства, чтобы он работал.

 hiveContext.setConf ("Hive.exec.dynamic.partition", "true") 
 hiveContext.setConf ("Hive.exec.dynamic.partition.mode", "nonstrict") 
29
Jins George

Я также столкнулся с тем же, но с помощью следующих уловок, которые я решил.

  1. Когда мы делаем любую таблицу как секционированную, тогда секционированная колонка становится чувствительной к регистру.

  2. Разделенный столбец должен присутствовать в DataFrame с тем же именем (с учетом регистра). Код:

    var dbName="your database name"
    var finaltable="your table name"
    
    // First check if table is available or not..
    if (sparkSession.sql("show tables in " + dbName).filter("tableName='" +finaltable + "'").collect().length == 0) {
         //If table is not available then it will create for you..
         println("Table Not Present \n  Creating table " + finaltable)
         sparkSession.sql("use Database_Name")
         sparkSession.sql("SET Hive.exec.dynamic.partition = true")
         sparkSession.sql("SET Hive.exec.dynamic.partition.mode = nonstrict ")
         sparkSession.sql("SET Hive.exec.max.dynamic.partitions.pernode = 400")
         sparkSession.sql("create table " + dbName +"." + finaltable + "(EMP_ID        string,EMP_Name          string,EMP_Address               string,EMP_Salary    bigint)  PARTITIONED BY (EMP_DEP STRING)")
         //Table is created now insert the DataFrame in append Mode
         df.write.mode(SaveMode.Append).insertInto(empDB + "." + finaltable)
    }
    
6
Nilesh Shinde

Это то, что работает для меня. Я устанавливаю эти параметры и затем помещаю данные в многораздельные таблицы.

from pyspark.sql import HiveContext
sqlContext = HiveContext(sc)
sqlContext.setConf("Hive.exec.dynamic.partition", "true")
sqlContext.setConf("Hive.exec.dynamic.partition.mode", 
"nonstrict")
0
Shaunak Bangale

Это работало для меня, используя python и spark 2.1.0.

Не уверен, что это лучший способ сделать это, но он работает ...

# WRITE DATA INTO A Hive TABLE
import pyspark
from pyspark.sql import SparkSession

spark = SparkSession \
    .builder \
    .master("local[*]") \
    .config("Hive.exec.dynamic.partition", "true") \
    .config("Hive.exec.dynamic.partition.mode", "nonstrict") \
    .enableHiveSupport() \
    .getOrCreate()

### CREATE Hive TABLE (with one row)
spark.sql("""
CREATE TABLE IF NOT EXISTS Hive_df (col1 INT, col2 STRING, partition_bin INT)
USING Hive OPTIONS(fileFormat 'PARQUET')
PARTITIONED BY (partition_bin)
LOCATION 'Hive_df'
""")
spark.sql("""
INSERT INTO Hive_df PARTITION (partition_bin = 0)
VALUES (0, 'init_record')
""")
###

### CREATE NON Hive TABLE (with one row)
spark.sql("""
CREATE TABLE IF NOT EXISTS non_Hive_df (col1 INT, col2 STRING, partition_bin INT)
USING PARQUET
PARTITIONED BY (partition_bin)
LOCATION 'non_Hive_df'
""")
spark.sql("""
INSERT INTO non_Hive_df PARTITION (partition_bin = 0)
VALUES (0, 'init_record')
""")
###

### ATTEMPT DYNAMIC OVERWRITE WITH EACH TABLE
spark.sql("""
INSERT OVERWRITE TABLE Hive_df PARTITION (partition_bin)
VALUES (0, 'new_record', 1)
""")
spark.sql("""
INSERT OVERWRITE TABLE non_Hive_df PARTITION (partition_bin)
VALUES (0, 'new_record', 1)
""")

spark.sql("SELECT * FROM Hive_df").show() # 2 row dynamic overwrite
spark.sql("SELECT * FROM non_Hive_df").show() # 1 row full table overwrite
0
isichei