我已经在qubole(hive)中创建了一个外部表,它从s3读取parquet(compressed:snappy)文件,但是在执行 SELECT * table_name
我得到除分区列以外的所有列的空值。
我尝试在serdeProperty中使用不同的serialization.format值,但仍然面临相同的问题。在搬走财产的时候 'serialization.format' = '1'
我要走了 ERROR: Failed with exception java.io.IOException:Can not read value at 0 in block -1 in file s3://path_to_parquet/
.
我检查了Parquet文件,能够使用Parquet工具读取数据:
**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
1条答案
按热度按时间hmmo2u0o1#
假设表是使用hive创建的,并且使用spark读取(因为问题被标记为
apache-spark-sql
)数据是如何创建的?
spark支持区分大小写的模式。当我们使用dataframeapi时,可以使用区分大小写的模式进行编写。
例子:
注意,在上面的示例中,保留了大小写敏感度。
当我们在spark创建的数据之上创建一个配置单元表时,配置单元将能够正确地读取它,因为它不区分大小写。
而当使用spark读取相同的数据时,它使用hive中的模式(默认情况下为小写),并且返回的行是
null
.为了克服这个问题,spark引入了一个配置
spark.sql.hive.caseSensitiveInferenceMode
.