无法查询 Spark 创建的镶木地板文件
Cannot query parquet file created by Spark
在 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 table
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';
更改table以添加分区
ALTER TABLE browser ADD PARTITION (fname='browser.parquet')
LOCATION 'hdfs://nameservice1/temp/dims/browser/browser.parquet';
Select * 来自 table in Hue returns 所有行和列都为空。
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
Spark 1.3.0
色调 3.7.0
关于如何解决此问题的任何指示,如果您需要其他信息,我会添加。
谢谢。
您使用的配置单元架构似乎与您的镶木地板文件内容不同,请参阅:
Row(browserID=u'1', browserName=u'Lynx 2.7.1')
它看起来完全不像 table 的定义。
您可以使用以下内容查看 spark 中的 parquet 模式:
val f = sqlContext.parquetFile( "your file")
f.schema.foreach( x => println(x.name, x.dataType))
并检查它与蜂巢的区别。
此外,为了确保涵盖所有基础知识,为什么不让 spark 为您创建配置单元 table?
val hc = new org.apache.spark.sql.hive.HiveContext(sc)
yourDF.saveAsTable("yourtable")
此外,最新版本的 Hive 原生支持镶木地板,因此您应该可以只说 "SAVE AS PARQUET" 而不是指定 serde/inputformat/outputformat
在 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 table
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';
更改table以添加分区
ALTER TABLE browser ADD PARTITION (fname='browser.parquet')
LOCATION 'hdfs://nameservice1/temp/dims/browser/browser.parquet';
Select * 来自 table in Hue returns 所有行和列都为空。
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
Spark 1.3.0
色调 3.7.0
关于如何解决此问题的任何指示,如果您需要其他信息,我会添加。 谢谢。
您使用的配置单元架构似乎与您的镶木地板文件内容不同,请参阅:
Row(browserID=u'1', browserName=u'Lynx 2.7.1')
它看起来完全不像 table 的定义。 您可以使用以下内容查看 spark 中的 parquet 模式:
val f = sqlContext.parquetFile( "your file")
f.schema.foreach( x => println(x.name, x.dataType))
并检查它与蜂巢的区别。
此外,为了确保涵盖所有基础知识,为什么不让 spark 为您创建配置单元 table?
val hc = new org.apache.spark.sql.hive.HiveContext(sc)
yourDF.saveAsTable("yourtable")
此外,最新版本的 Hive 原生支持镶木地板,因此您应该可以只说 "SAVE AS PARQUET" 而不是指定 serde/inputformat/outputformat