PySpark не может вставить в таблицу Hive, потому что «может записывать данные только в связи с одним путем» - PullRequest
1 голос
/ 08 марта 2019

У меня есть таблица Hive Orc с определением, аналогичным следующему определению

CREATE EXTERNAL TABLE `example.example_table`(
  ...
  )
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.orc.OrcSerde' 
WITH SERDEPROPERTIES ( 
  'path'='s3a://path/to/table') 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
LOCATION
  's3a://path/to/table'
TBLPROPERTIES (
  ...
)

Я пытаюсь использовать PySpark для добавления фрейма данных к этой таблице, используя пример «df.write.insertInto (»).example_table ")".При выполнении этого я получаю следующую ошибку:

org.apache.spark.sql.AnalysisException: Can only write data to relations with a single path.;
    at org.apache.spark.sql.execution.datasources.DataSourceAnalysis$$anonfun$apply$1.applyOrElse(DataSourceStrategy.scala:188)
    at org.apache.spark.sql.execution.datasources.DataSourceAnalysis$$anonfun$apply$1.applyOrElse(DataSourceStrategy.scala:134)
    ...

При взгляде на базовый Scala-код условие, которое выдает эту ошибку, проверяет, имеет ли местоположение таблицы несколько значений "rootPaths».Очевидно, моя таблица определена с одним местоположением.Что еще может вызвать это?

1 Ответ

1 голос
/ 15 марта 2019

Именно этот путь, который вы определяете, вызывает ошибку.Я сам столкнулся с этой же проблемой.Hive генерирует путь к местоположению на основе свойства hive.metastore.warehouse.dir, поэтому у вас есть это местоположение по умолчанию плюс указанный вами путь, что приводит к сбою связанного кода.

Если вы хотите выбрать другой путь, отличный отпо умолчанию, затем попробуйте использовать LOCATION.

Попробуйте выполнить запрос describe extended example.example_table, чтобы увидеть более подробную информацию о таблице.Одна из выходных строк будет Подробная информация о таблице , которая содержит кучу полезной информации:

Table(
  tableName:
  dbName:
  owner:
  createTime:1548335003
  lastAccessTime:0
  retention:0
  sd:StorageDescriptor(cols:
    location:[*path_to_table*]
    inputFormat:org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat
    outputFormat:org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat
    compressed:false
    numBuckets:-1
    serdeInfo:SerDeInfo(
      name:null
      serializationLib:org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe
      parameters:{
        serialization.format=1
        path=[*path_to_table*]
      }
    )
    bucketCols:[]
    sortCols:[]
    parameters:{}
    skewedInfo:SkewedInfo(skewedColNames:[]
    skewedColValues:[]
    skewedColValueLocationMaps:{})
    storedAsSubDirectories:false
  )
  partitionKeys:[]
  parameters:{transient_lastDdlTime=1548335003}
  viewOriginalText:null
  viewExpandedText:null
  tableType:MANAGED_TABLE
  rewriteEnabled:false
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...