【问题标题】:Read a csv into an RDD using Spark 2.0使用 Spark 2.0 将 csv 读入 RDD
【发布时间】:2017-04-22 14:52:58
【问题描述】:

我想使用 Spark 2.0 将 csv 文件读入 RDD。我可以使用

将它读入数据框
df = session.read.csv("myCSV.csv", header=True,)

我可以将其加载为文本文件,然后使用

import csv
rdd = context.textFile("myCSV.csv")
header = rdd.first().replace('"','').split(',')
rdd = (rdd.mapPartitionsWithIndex(lambda idx, itr: itr.drop(1) if idx == 0 else itr)
        .mapPartitions(lambda x: csv.reader(x))
      )

有没有办法使用内置的 csv 阅读器 (spark-csv) 直接进入 RDD,而无需从数据帧转换为 csv?或者上面的 RDD 方法可能足够好,因为内置阅读器在引擎盖下做了类似的事情?

编辑:1) 同样,我不想读入数据帧然后转换为 RDD。这将建立一个完整的结构,只是让它立即被丢弃。似乎毫无意义。 2) 是的,我可以对上述时间进行计时(针对 DF -> RDD 转换),但这只会告诉我我的 RDD 读取解决方案是否比转换更好。内置的 csv 到 RDD 方法很可能比上述代码更优化。

【问题讨论】:

    标签: csv apache-spark pyspark spark-dataframe


    【解决方案1】:

    您可以使用.rdd 将数据帧转换为rdd,如下所示

    rdd = session.read.csv("myCSV.csv", header=True).rdd
    

    【讨论】:

    • 就像我在原始问题中所说的那样,无需转换。 :) 建立一些结构然后立即放弃它似乎很愚蠢。
    • 啊,我错过了。好吧,从 DF 转换为 RDD 不需要任何计算成本,但你是对的,你可能会浪费一些资源来构建结构。构建结构的开销应该很小,因为 CSV 由第一行定义(例如,不需要扫描整个文件)。他们只有通过一些时间测试才能确定它。
    • 我可以进行计时测试,但如果存在内置方法,我相信它会比我上面的解决方案更优化。所以时间只会告诉我上述解决方案是否比转换更好。
    • 公平点。不幸的是,我不相信有内置的方法可以做到这一点。我猜这是因为在这种情况下确定架构以制作 DF 的开销几乎是无关紧要的。 CSV 具有类似数据框的格式(与 json 文件相反,后者更像 RDD)
    猜你喜欢
    • 2017-02-15
    • 2016-02-21
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    相关资源
    最近更新 更多