web-dev-qa-db-ja.com

DataFrameをHiveに直接保存する方法は?

sparkのDataFrameをHiveに直接保存することは可能ですか?.

DataFrameRddに変換し、テキストファイルとして保存してから、Hiveに読み込んでみました。しかし、dataframeを直接Hiveに保存できるかどうか疑問に思っています

60
Gourav

インメモリ一時テーブルを作成し、sqlContextを使用してHiveテーブルに保存できます。

データフレームがmyDfであるとします。次を使用して1つの一時テーブルを作成できます。

myDf.createOrReplaceTempView("mytempTable") 

次に、単純なHiveステートメントを使用してテーブルを作成し、一時テーブルからデータをダンプできます。

sqlContext.sql("create table mytable as select * from mytempTable");
86
Vinay Kumar

DataFrameWriter.saveAsTable を使用します。 (df.write.saveAsTable(...)Spark SQL and DataFrame Guide を参照してください。

17
Daniel Darabos

Spark 2.0ドキュメントで非推奨のdf.write.saveAsTable(...)が表示されません。 Amazon EMRで機能しました。 S3からデータフレームにデータを完全に読み込み、処理し、結果からテーブルを作成し、MicroStrategyで読み込むことができました。 Vinaysの回答も機能しました。

14
Alex

あなたはHiveContextを持っている/作成する必要があります

import org.Apache.spark.sql.Hive.HiveContext;

HiveContext sqlContext = new org.Apache.spark.sql.Hive.HiveContext(sc.sc());

次に、データフレームを直接保存するか、Hiveテーブルとして保存する列を選択します

dfはデータフレームです

df.write().mode("overwrite").saveAsTable("schemaName.tableName");

または

df.select(df.col("col1"),df.col("col2"), df.col("col3")) .write().mode("overwrite").saveAsTable("schemaName.tableName");

または

df.write().mode(SaveMode.Overwrite).saveAsTable("dbName.tableName");

SaveModesはAppend/Ignore/Overwrite/ErrorIfExistsです

ここにSpark DocumentationからHiveContextの定義を追加しました。

基本的なSQLContextに加えて、基本的なSQLContextによって提供される機能のスーパーセットを提供するHiveContextを作成することもできます。追加の機能には、より完全なHiveQLパーサーを使用してクエリを記述する機能、Hive UDFへのアクセス、Hiveテーブルからデータを読み取る機能が含まれます。 HiveContextを使用するために、既存のHiveセットアップを用意する必要はありません。また、SQLContextで使用可能なすべてのデータソースは引き続き使用可能です。 HiveContextは、デフォルトのSparkビルドにすべてのHiveの依存関係が含まれないように、個別にのみパッケージ化されます。


Sparkバージョン1.6.2で、「dbName.tableName」を使用するとこのエラーが発生します。

org.Apache.spark.sql.AnalysisException:データベース名または他の修飾子の指定は一時テーブルには許可されていません。テーブル名にドット(。)が含まれる場合は、テーブル名をバッククォート()で囲んでください。

12
Anandkumar

Hiveへの保存は、SQLContextのwrite()メソッドを使用するだけです。

df.write.saveAsTable(tableName)

https://spark.Apache.org/docs/2.1.0/api/Java/org/Apache/spark/sql/DataFrameWriter.html#saveAsTable(Java.lang.String) を参照してください

Spark 2.2から:DataFrameの代わりにDataSetを使用します。

5

以下は、寄木細工のファイルからHiveテーブルを作成するPySparkバージョンです。推論されたスキーマを使用してParquetファイルを生成し、定義をHiveメタストアにプッシュしたい場合があります。 Hiveメタストアだけでなく、AWS GlueやAWS Athenaなどのシステムに定義をプッシュすることもできます。ここでは、spark.sqlを使用して永続テーブルをプッシュ/作成しています。

   # Location where my parquet files are present.
    df = spark.read.parquet("s3://my-location/data/")
    cols = df.dtypes
    buf = []
    buf.append('CREATE EXTERNAL TABLE test123 (')
    keyanddatatypes =  df.dtypes
    sizeof = len(df.dtypes)
    print ("size----------",sizeof)
    count=1;
    for eachvalue in keyanddatatypes:
        print count,sizeof,eachvalue
        if count == sizeof:
            total = str(eachvalue[0])+str(' ')+str(eachvalue[1])
        else:
            total = str(eachvalue[0]) + str(' ') + str(eachvalue[1]) + str(',')
        buf.append(total)
        count = count + 1

    buf.append(' )')
    buf.append(' STORED as parquet ')
    buf.append("LOCATION")
    buf.append("'")
    buf.append('s3://my-location/data/')
    buf.append("'")
    buf.append("'")
    ##partition by pt
    tabledef = ''.join(buf)

    print "---------print definition ---------"
    print tabledef
    ## create a table using spark.sql. Assuming you are using spark 2.1+
    spark.sql(tabledef);
1
kartik