创建 RDD 与创建 RDD 所花费的时间。来自 HDFS 文件的数据帧

Posted

技术标签:

【中文标题】创建 RDD 与创建 RDD 所花费的时间。来自 HDFS 文件的数据帧【英文标题】:Time taken in creating RDD Vs. Dataframe from HDFS File 【发布时间】:2018-11-01 11:44:46 【问题描述】:

我在 HDFS 上有一个具有以下块大小配置的文件。

Status: HEALTHY  Total size:    1172387607850 B  Total dirs:    0  Total files:   1  Total symlinks:                0  Total blocks (validated):      8735 (avg. block size 134217241 B)  Minimally replicated blocks:   8735 (100.0 %)  Over-replicated blocks:        0 (0.0 %)  Under-replicated blocks:       0 (0.0 %)  Mis-replicated blocks:         0 (0.0 %)  Default replication factor:    3  Average block replication:     3.0  Corrupt blocks:                0  Missing replicas:              0 (0.0 %)  Number of data-nodes:          16  Number of racks:               1 FSCK ended at Tue Oct 30 02:30:04 EDT 2018 in 75 milliseconds  

我尝试通过简单命令使用给定文件创建 RDD

rdd1 = sqlContext.textFile("File HDFS path")  
rdd1.take(50)

此命令以毫秒为单位运行

然后我尝试使用相同的文件创建 Dataframe。由于创建的任务数为 8735(文件中的块数),因此花费了很多时间。

data_df = spark.read.format("com.databricks.spark.csv") \
  .option("header", "false") \
  .option("inferschema", "true") \
  .option("delimiter", "|").load(HDFS_FILE_PATH)

dataframe 和 RDD 中的分区数相同 (8735)。 创建数据框时消耗时间的原因是什么。

【问题讨论】:

【参考方案1】:

你比较RDD代码

不进行模式推断, 除了定位新行之外没有解析, 并且只读取前 50 行(可能最多一个分区)。

Dataset代码

必须解析所有记录(读取文件的所有行) 并推断架构。

期望两者花费相同的时间是不现实的。

【讨论】:

以上是关于创建 RDD 与创建 RDD 所花费的时间。来自 HDFS 文件的数据帧的主要内容,如果未能解决你的问题,请参考以下文章

pyspark中的RDD到DataFrame(来自rdd的第一个元素的列)

如何从 RDD 创建 Spark 数据集

RDD的概念与创建

来自现有 RDD 的数据框 - Python Spark

连接来自两个不同数据库的 RDD

PySpark:从数据框列表创建 RDD