从hdfs读取ocr文件后,令人难以置信的火花数据帧

Fab*_*ian 7 hadoop hdfs hadoop-yarn apache-spark pyspark

我在使用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|
+-------+------------------+
Run Code Online (Sandbox Code Playgroud)

这些价值观似乎是合理的.

现在我将我的数据上传到hadoop集群(ambari setup,yarn,11个节点)并将其推送到hdfs使用 hadoop fs -put /home/username/mydata /mydata

现在我测试了与下表结尾的相同代码:

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|
+-------+------------------+
Run Code Online (Sandbox Code Playgroud)

但另一件事是完全地困惑我- >如果我改变mydata/*.orcmydata/any_single_file.orchdfs:///mydata/*.orchdfs:///mydata/any_single_file.orc两个表(集群,本地PC)都是一样的...

有没有人更多地了解这种奇怪的行为?

非常感谢!

Fab*_*ian 0

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

所以我的解决方法是依次加载 orc 文件,然后我使用该df.write.parquet()方法来转换它们。转换完成后。我可以在文件路径中使用 *.parquet 而不是 *.orc 将它们全部加载在一起。