sparkのDataFrame
をHiveに直接保存することは可能ですか?.
DataFrame
をRdd
に変換し、テキストファイルとして保存してから、Hiveに読み込んでみました。しかし、dataframe
を直接Hiveに保存できるかどうか疑問に思っています
インメモリ一時テーブルを作成し、sqlContextを使用してHiveテーブルに保存できます。
データフレームがmyDfであるとします。次を使用して1つの一時テーブルを作成できます。
myDf.createOrReplaceTempView("mytempTable")
次に、単純なHiveステートメントを使用してテーブルを作成し、一時テーブルからデータをダンプできます。
sqlContext.sql("create table mytable as select * from mytempTable");
DataFrameWriter.saveAsTable
を使用します。 (df.write.saveAsTable(...)
) Spark SQL and DataFrame Guide を参照してください。
Spark 2.0ドキュメントで非推奨のdf.write.saveAsTable(...)
が表示されません。 Amazon EMRで機能しました。 S3からデータフレームにデータを完全に読み込み、処理し、結果からテーブルを作成し、MicroStrategyで読み込むことができました。 Vinaysの回答も機能しました。
あなたは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:データベース名または他の修飾子の指定は一時テーブルには許可されていません。テーブル名にドット(。)が含まれる場合は、テーブル名をバッククォート()で囲んでください。
Hiveへの保存は、SQLContextのwrite()
メソッドを使用するだけです。
df.write.saveAsTable(tableName)
Spark 2.2から:DataFrameの代わりにDataSetを使用します。
以下は、寄木細工のファイルから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);