Ошибка при записи в таблицу Hive от Spark Sql - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь вставить данные в таблицу Hive External из Spark Sql.Я создал внешнюю таблицу улья с помощью следующей команды

CREATE EXTERNAL TABLE  tab1 ( col1 type,col2 type ,col3 type) CLUSTERED BY (col1,col2) SORTED BY (col1) INTO 8 BUCKETS STORED AS PARQUET

В моей работе по иске я написал следующий код: Dataset df = session.read (). Option ("header", "true").csv (csvInput);

df.repartition(numBuckets, somecol)
                  .write()
                  .format("parquet")
                  .bucketBy(numBuckets,col1,col2)
                  .sortBy(col1)
                  .saveAsTable(hiveTableName);

Каждый раз, когда я запускаю этот код, я получаю следующее исключение

org.apache.spark.sql.AnalysisException: Table `tab1` already exists.;
    at org.apache.spark.sql.DataFrameWriter.saveAsTable(DataFrameWriter.scala:408)
    at org.apache.spark.sql.DataFrameWriter.saveAsTable(DataFrameWriter.scala:393)
    at somepackage.Parquet_Read_WriteNew.writeToParquetHiveMetastore(Parquet_Read_WriteNew.java:100)

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Вы должны указать режим сохранения при сохранении данных в кусте.

df.write.mode(SaveMode.Append)
              .format("parquet")
              .bucketBy(numBuckets,col1,col2)
              .sortBy(col1)
              .insertInto(hiveTableName);

Spark предоставляет следующие режимы сохранения:

Режим сохранения

ErrorIfExists: выдает исключение, если цель уже существует.Если цель не существует, запишите данные.

Append: Если цель уже существует, добавьте к ней данные.Если данные не существуют, запишите их.

Overwrite: если цель уже существует, удалите цель.Запишите данные.

Ignore: Если цель уже существует, пропустите запись.В противном случае запишите данные.

0 голосов
/ 10 октября 2018

Вы используете saveAsTable API, который создает таблицу в Hive.Поскольку вы уже создали таблицу кустов с помощью команды, таблица tab1 уже существует.поэтому, когда Spark API пытается его создать, он выдает ошибку, говоря, что таблица уже существует, org.apache.spark.sql.AnalysisException: Table tab1 already exists.

Либо удалите таблицу и позвольте API-интерфейсу spark saveAsTable создать саму таблицу.Или используйте API insertInto для вставки в существующую таблицу кустов.

df.repartition(numBuckets, somecol)
                  .write()
                  .format("parquet")
                  .bucketBy(numBuckets,col1,col2)
                  .sortBy(col1)
                  .insertInto(hiveTableName);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...