PySpark无法将其插入到Hive表中,因为“只能将数据写入到具有单个路径的关系中”

时间:2019-03-08 16:25:51

标签: apache-spark hive pyspark

我有一个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.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 code时,引发此错误的条件是检查表位置是否具有多个“ rootPaths”。显然,我的表是用单个位置定义的。还有什么可能导致这个?

1 个答案:

答案 0 :(得分:1)

正是您所定义的路径导致了错误。我自己也遇到了同样的问题。 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
)