我在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设置,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)都相同...

有人对这种怪异的行为了解更多吗?

非常感谢!

最佳答案

在为我搜索了一周的“解决方案”之后,发现在某些文件中,架构有些不同(或多或少的一列),尽管在 Parquet 中实现了架构合并,但orc目前不支持架构合并..
https://issues.apache.org/jira/plugins/servlet/mobile#issue/SPARK-11412

因此,我的解决方法是一个接一个地加载orc文件,然后使用df.write.parquet()方法对其进行转换。转换完成后。我可以使用* .parquet而不是文件路径中的* .orc将它们一起加载。

关于hadoop - 从hdfs读取ocr文件后令人难以置信地触发数据帧,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45073406/

10-16 01:25