我在Ambari上使用spark 2.1.1和hadoop 2.6时遇到问题。我首先在本地计算机上测试了我的代码(单节点,本地文件),一切都按预期工作:
from pyspark.sql import SparkSession
spark = SparkSession\
.builder\
.master('yarn')\
.appName('localTest')\
.getOrCreate()
data = spark.read.format('orc').load('mydata/*.orc')
data.select('colname').na.drop().describe(['colname']).show()
+-------+------------------+
|summary| colname |
+-------+------------------+
| count| 1688264|
| mean|17.963293650793652|
| stddev|5.9136724822401425|
| min| 0.5|
| max| 87.5|
+-------+------------------+
这些值是合情合理的。
现在我将数据上传到hadoop集群(ambari setup,yarn,11个节点)并使用hadoop fs -put /home/username/mydata /mydata
将其推送到hdfs
现在我测试了相同的代码,结果如下表所示:
from pyspark.sql import SparkSession
spark = SparkSession\
.builder\
.master('yarn')\
.appName('localTest')\
.getOrCreate()
data = spark.read.format('orc').load('hdfs:///mydata/*.orc')
data.select('colname').na.drop().describe(['colname']).show()
+-------+------------------+
|summary| colname |
+-------+------------------+
| count| 2246009|
| mean|1525.5387403802445|
| stddev|16250.611372902456|
| min| -413050.0|
| max| 1.6385821E7|
+-------+------------------+
但另一件事让我完全混淆 - >如果我将mydata/*.orc
更改为mydata/any_single_file.orc
而将hdfs:///mydata/*.orc
更改为hdfs:///mydata/any_single_file.orc
,则两个表(群集,本地PC)都相同...
有没有人更了解这种奇怪的行为?
非常感谢!
答案 0 :(得分:0)
在为我搜索“解决方案”一周后,在某些文件中,架构有点不同(或多或少是一列),并且虽然在镶木地板中实现了架构合并,但orc不支持架构现在合并.. https://issues.apache.org/jira/plugins/servlet/mobile#issue/SPARK-11412
所以我的解决方法是一个接一个地加载orc文件,然后我使用df.write.parquet()
方法转换它们。转换完成后。我可以使用* .parquet而不是文件路径中的* .orc一起加载它们。