2017-12-15 12 views
0

Spark 2.1.0 Java APIを使用して、DataFrame(行のデータセット)をHiveテーブルとして保持しようとしています。私はDataFrameWriterクラスのsaveAsTableメソッドを使ってみました。 df.write(appendMode).saveAsTable("tablename");Spark 2.x saveAsTable

私は

org.apache.spark.sql.AnalysisExceptionことを知らせるAnalysisException取得:私のハイブserdeでセーブデータが テーブルはまだサポートされていませんが

私のコードは次のようになります。 代替

私は本当にsaveAsTableメソッドを使用することはできませんようinsertInto() APIを使用してください? apiのドキュメントで非推奨とマークされていません。

+0

あなたのテーブルは既に存在しますか? – hlagos

+0

はい。私は既存のテーブルに追加しようとしています – 7luckyseven7

+0

あなたのテーブルフォーマットは何ですか?保存中に書式を指定して問題を解決しますか?たとえば、寄木張りの場合 df.write(appendMode).format( "parquet")。 saveAsTable( "tablename"); – hlagos

答えて

0

データを追加しようとしているテーブル「tablename」が"Hive serde"で作成されているため、テーブルtablenameのデータがテキストファイルとして保存されるためです。

org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe serdeを使用してparquet形式でデータを書き込む、saveAsTable Apiを使用しています。だから、スパークAPIは、テキストで寄せ木細工のデータを追加することはできません、その理由は例外です。

解決策:事前にテーブルを作成しないでください。 "saveAsTable" Apiは、データフレームのスキーマと最初に必要なプロパティを使用してテーブル自体を作成してから、データを追加し続けます。

テーブルを自分で作成する必要がある場合は、テーブルがパーケットとして適切にTBLPROPERTIESに格納されていることを確認する必要があります。例えば:

CREATE TABLE `savetest`(
    `channel` string, 
    `address` string, 
    `curr_date` string) 
ROW FORMAT SERDE 
    'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
STORED AS INPUTFORMAT 
    'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' 
OUTPUTFORMAT 
    'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' 
TBLPROPERTIES (
    'COLUMN_STATS_ACCURATE'='false', 
    'numFiles'='2', 
    'numRows'='-1', 
    'rawDataSize'='-1', 
    'spark.sql.sources.provider'='parquet', 
    'spark.sql.sources.schema.numParts'='1', 
    'spark.sql.sources.schema.part.0'='{\"type\":\"struct\",\"fields\":[{\"name\":\"channel\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"address\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"curr_date\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}}]}' 
) 
関連する問題