Hadoop 如何使用Hive1.2从s3中的拼花文件创建外部表格?

Hadoop 如何使用Hive1.2从s3中的拼花文件创建外部表格?,hadoop,hive,hiveql,qubole,Hadoop,Hive,Hiveql,Qubole,我在Qubole(Hive)中创建了一个外部表,它从s3读取拼花(压缩:snappy)文件,但是在执行SELECT*table_name时,除了分区列之外,所有列的值都为空 我尝试在SerdeProperty中使用不同的serialization.format值,但仍然面临相同的问题。 在删除属性'serialization.format'='1'时,我得到错误:失败,出现异常java.io.IOException:无法读取文件s3://path\u to\u parquet/中块-1中0处的值

我在Qubole(Hive)中创建了一个外部表,它从s3读取拼花(压缩:snappy)文件,但是在执行
SELECT*table_name
时,除了分区列之外,所有列的值都为空

我尝试在SerdeProperty中使用不同的serialization.format值,但仍然面临相同的问题。 在删除属性
'serialization.format'='1'
时,我得到
错误:失败,出现异常java.io.IOException:无法读取文件s3://path\u to\u parquet/
中块-1中0处的值

我检查了拼花文件,能够使用拼花工具读取数据:

**file_01.snappy.parquet:**
{"col_2":1234,"col_3":ABC}
{"col_2":124,"col_3":FHK}
{"col_2":12515,"col_3":UPO}


**External table stmt:**
CREATE EXTERNAL TABLE parquet_test
(
    col2 int,
    col3 string
)
PARTITIONED BY (col1 date) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
WITH SERDEPROPERTIES (
  'serialization.format' = '1'
)
STORED AS PARQUET
LOCATION 's3://path_to_parquet'
TBLPROPERTIES ('parquet.compress'='SNAPPY');

Result:
col_1   col_2   col_3
5/3/19  NULL    NULL
5/4/19  NULL    NULL
5/5/19  NULL    NULL
5/6/19  NULL    NULL

Expected Result:
col_1   col_2   col_3
5/3/19  1234    ABC
5/4/19  124     FHK
5/5/19  12515   UPO
5/6/19  1234    ABC

假设该表是使用配置单元创建的,并使用Spark读取,则编写下面的答案(因为该问题标记为
ApacheSarkSQL

数据是如何创建的? Spark支持区分大小写的模式。 当我们使用dataframe API时,可以使用区分大小写的模式进行编写。
例如:

scala> case class Employee(iD: Int, NaMe: String )
defined class Employee
scala> val df =spark.range(10).map(x => Employee(x.toInt, s"name$x")).write.save("file:///tmp/data/")
scala> spark.read.parquet("file:///tmp/data/").printSchema
root
 |-- iD: integer (nullable = true)
 |-- NaMe: string (nullable = true)
请注意,在上述示例中,保留了区分大小写的功能。
当我们在Spark创建的数据之上创建一个配置单元表时,配置单元将能够正确读取它,因为它不区分大小写。
而当使用Spark读取相同的数据时,它使用Hive中的模式,默认情况下是小写,返回的行是
null

为了克服这个问题,Spark引入了一个config
Spark.sql.hive.caseSensitiveInferenceMode

object HiveCaseSensitiveInferenceMode extends Enumeration {
  val INFER_AND_SAVE, INFER_ONLY, NEVER_INFER = Value
}

val HIVE_CASE_SENSITIVE_INFERENCE = buildConf("spark.sql.hive.caseSensitiveInferenceMode")
  .doc("Sets the action to take when a case-sensitive schema cannot be read from a Hive " +
    "table's properties. Although Spark SQL itself is not case-sensitive, Hive compatible file " +
    "formats such as Parquet are. Spark SQL must use a case-preserving schema when querying " +
    "any table backed by files containing case-sensitive field names or queries may not return " +
    "accurate results. Valid options include INFER_AND_SAVE (the default mode-- infer the " +
    "case-sensitive schema from the underlying data files and write it back to the table " +
    "properties), INFER_ONLY (infer the schema but don't attempt to write it to the table " +
    "properties) and NEVER_INFER (fallback to using the case-insensitive metastore schema " +
    "instead of inferring).")
  .stringConf
  .transform(_.toUpperCase(Locale.ROOT))
  .checkValues(HiveCaseSensitiveInferenceMode.values.map(_.toString))
  .createWithDefault(HiveCaseSensitiveInferenceMode.INFER_AND_SAVE.toString)
推断和保存
-Spark推断模式并存储在元存储中,作为表的
tbleProperty的一部分(
desc extended
应该会显示这一点)
如果该属性的值为NOT
expert_AND_SAVE
expert_ONLY
,则Spark将使用metastore表中的模式,并且将无法读取拼花地板文件。 自Spark 2.2.0以来,该属性的默认值为
expert_和_SAVE

我们可以检查以下内容,看看问题是否与模式敏感性有关:
1.
spark.sql.hive.caseSensitiveInferenceMode的值
spark.sql(“set spark.sql.hive.caseSensitiveInferenceMode”)
应显示此值)
2.如果使用Spark创建的数据 3.如果2为true,请检查架构是否区分大小写(
spark.read().printSchema

4.如果3使用区分大小写的架构,并且1的输出不是
expert\u and\u SAVE
/
expert\u ONLY
,请设置
spark.sql(“set spark.sql.hive.caseSensitiveInferenceMode=expert\u and\u SAVE”)
,删除该表,重新创建该表并尝试从spark读取数据。

嗨,您可以尝试:不指定行格式serde吗?(删除行格式为serde的行)。如果不起作用,请重试:
行格式分隔字段,以“,”结尾。
您还可以检查拼花地板文件的架构,因为配置单元表
列3
应该是
字符串。请验证架构,然后重新创建配置单元表以检查加载是否正确。hey@F.Lazarescu,谢谢,但我尝试删除行格式serde&添加了以“,”结尾的
行格式分隔字段
,但在这两种情况下都给了我相同的错误:(嘿@Joby,我检查了问题中的模式并更新了模式,这是错误的。谢谢