hadoop - 无法查询 Spark 创建的 Parquet 文件

标签 hadoop apache-spark hive parquet

在 Spark 中创建了一个 parquet 文件。这是代码片段

parquet_file_name = os.path.join(partition, os.path.basename(fileLocation) + ".parquet")

dfData = sqlContext.createDataFrame(addedColumns, schema)

dfData.save(parquet_file_name, "parquet", "append")

我可以在 Spark 中读取文件内容。

In [1]:
sqlContext = SQLContext(sc)
parquetFile = sqlContext.parquetFile("/temp//browser/pub/browser.parquet/part-r-00001.parquet")
parquetFile.head(10)
​
Out[1]:
[Row(browserID=u'1', browserName=u'Lynx 2.7.1'),
 Row(browserID=u'2', browserName=u'Lynx 2.7'),
 Row(browserID=u'3', browserName=u'Lynx 2.6'),
 Row(browserID=u'4', browserName=u'Lynx 2.5'),
 Row(browserID=u'5', browserName=u'Lynx 2.4'),
 Row(browserID=u'6', browserName=u'Lynx (unknown version)'),
 Row(browserID=u'7', browserName=u'Lotus Notes 4.5'),
 Row(browserID=u'8', browserName=u'AOL 4.0'),
 Row(browserID=u'9', browserName=u'AOL 3.0'),
 Row(browserID=u'10', browserName=u'Microsoft Internet Explorer 5.0 beta 2')]

使用以下语法在 parquet 文件上创建了一个 Hive 外部表

CREATE EXTERNAL TABLE browser
(
fld1 string,
fld2 string,
FileName string,
LoadDate string,
Checksum string,
RecordId string
)
PARTITIONED BY (fname string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS
INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION 'hdfs://nameservice1/temp/dims/browser';

修改表以添加分区

ALTER TABLE browser ADD PARTITION (fname='browser.parquet')
LOCATION 'hdfs://nameservice1/temp/dims/browser/browser.parquet';

在 Hue 中从表中选择 * 对所有行和列返回 null。

select * from browser;

browser.fld1    browser.fld2    browser.filename    browser.loaddate    browser.checksum    browser.recordid    browser.fname
0   NULL    NULL    NULL    NULL    NULL    NULL    browser.parquet/part-r-00001.parquet
1   NULL    NULL    NULL    NULL    NULL    NULL    browser.parquet/part-r-00001.parquet
2   NULL    NULL    NULL    NULL    NULL    NULL    browser.parquet/part-r-00001.parquet
3   NULL    NULL    NULL    NULL    NULL    NULL    browser.parquet/part-r-00001.parquet
4   NULL    NULL    NULL    NULL    NULL    NULL    browser.parquet/part-r-00001.parquet
5   NULL    NULL    NULL    NULL    NULL    NULL    browser.parquet/part-r-00001.parquet
6   NULL    NULL    NULL    NULL    NULL    NULL    browser.parquet/part-r-00001.parquet

Cloudera CDH 5.4.1

星火 1.3.0

色调 3.7.0

有关如何解决此问题的任何指示,如果您需要其他信息,我会添加。 谢谢。

最佳答案

看起来您使用的配置单元架构与您的 Parquet 文件内容不同,请参阅:

Row(browserID=u'1', browserName=u'Lynx 2.7.1')

它看起来一点也不像表定义。 您可以使用类似以下内容查看 spark 中的 parquet 模式:

val f = sqlContext.parquetFile( "your file")
f.schema.foreach( x => println(x.name, x.dataType))

并检查它与 hive 的区别。

此外,为了确保涵盖所有基础知识,为什么不让 spark 为您创建 hive 表?

val hc = new org.apache.spark.sql.hive.HiveContext(sc)
yourDF.saveAsTable("yourtable")

另外,最新版本的 hive 原生支持 parquet,因此您应该能够只说“SAVE AS PARQUET”而不是指定 serde/inputformat/outputformat

关于hadoop - 无法查询 Spark 创建的 Parquet 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35328815/

相关文章:

hadoop - Spark 的 oozie 等价物是什么?

java - HDFS文件内容的Java拆分方法

hadoop - json 文档缺失字段的 Avro 序列化问题

java - 为什么(在 "cluster"模式下)我的 UDF 在本地(在驱动程序中)而不是在工作线程上执行

apache-spark - 如何使结构化流中的 dropDuplicates 状态过期以避免 OOM?

mysql - 在 hive 中使用多个 or 和 and 条件时出错

scala - 如何将 Scalding ValuePipe 加入 TypedPipe?

apache-spark - 在循环中评估 Spark DataFrame 会随着每次迭代变慢,所有工作都由 Controller 完成

hadoop - 将 Spark 设置为 Hive 的默认执行引擎

mysql - Sqoop 使用 "sqoop create-hive-table"创建表模式