【问题标题】:Why is difference between sqlContext.read.load and sqlContext.read.text?为什么 sqlContext.read.load 和 sqlContext.read.text 有区别?
【发布时间】:2017-12-05 02:11:37
【问题描述】:

我只是想将文本文件读入 pyspark RDD,我注意到 sqlContext.read.loadsqlContext.read.text 之间存在巨大差异。

s3_single_file_inpath='s3a://bucket-name/file_name'

indata = sqlContext.read.load(s3_single_file_inpath, format='com.databricks.spark.csv', header='true', inferSchema='false',sep=',')
indata = sqlContext.read.text(s3_single_file_inpath)

上面的sqlContext.read.load 命令失败并显示

Py4JJavaError: An error occurred while calling o227.load.
: java.lang.ClassNotFoundException: Failed to find data source: com.databricks.spark.csv. Please find packages at http://spark-packages.org

但是第二个成功了?

现在,我对此感到困惑,因为我在网上看到的所有资源都说使用sqlContext.read.load,包括这个:https://spark.apache.org/docs/1.6.1/sql-programming-guide.html

我不清楚何时使用这些中的哪一个。这些有明显区别吗?

【问题讨论】:

  • 有什么“巨大差异”?我只能在您的问题中看到一个失败,而另一个没有。

标签: apache-spark pyspark apache-spark-sql spark-csv


【解决方案1】:

为什么 sqlContext.read.load 和 sqlContext.read.text 有区别?

sqlContext.read.load 假定 parquet 作为数据源格式,而 sqlContext.read.text 假定 text 格式。

使用sqlContext.read.load,您可以使用format 参数定义数据源格式。


根据 Spark 1.62.x 的版本,您可能会也可能不会加载外部 Spark 包以支持 csv格式。

从 Spark 2.0 开始,您不再需要加载 spark-csv Spark 包,因为(引用 official documentation):

注意:此功能已在 Apache Spark 2.x 中内联。此软件包处于维护模式,我们只接受严重的错误修复。

这可以解释为什么您会感到困惑,因为您可能一直在使用 Spark 1.6.x 并且尚未加载 Spark 包以获得csv 支持。

现在,我对此感到困惑,因为我在网上看到的所有资源都说使用sqlContext.read.load,包括这个:https://spark.apache.org/docs/1.6.1/sql-programming-guide.html

https://spark.apache.org/docs/1.6.1/sql-programming-guide.html 适用于 Spark 1.6.1,而 spark-csv Spark 包不是 Spark 的一部分。它发生在 Spark 2.0 中。


我不清楚何时使用这些中的哪一个。这些有明显区别吗?

实际上没有iff您使用 Spark 2.x。

如果您使用 Spark 1.6.x,则必须使用 --packages 选项单独加载 spark-csv(如 Using with Spark shell 中所述):

可以使用--packages 命令行选项将此包添加到 Spark。例如,在启动 spark shell 时包含它


事实上,您仍然可以在 Spark 2.x 中显式使用 com.databricks.spark.csv 格式,因为它在内部已被识别。

【讨论】:

  • 所以你的意思是不管你用spark.read.csv()/spark.read.text()还是spark.read.load(),都是一回事,对Spark 2.x没有区别?
  • 几乎是的。数据源可以使用一些优化来使加载更有效(例如模式推断),但这只是讨论中的小问题。
  • 哦,这很让人放心。非常感谢雅克。如果我可能会问您另一个问题 - 在使用这些导入功能时,我们可以指定 numberOfPartitions 吗?还是之后我们必须求助于repartition()?如果您愿意,我可以将其作为另一个问题发布并与您亲密,以便您可以在那里回答。请告诉我。
  • 分区数?不。它与数据源正交,因此它不必处理诸如分区之类的低级事物。
  • 嗯,你的推理水平很高,我现在可以理解:) 我会进一步调查。非常感谢 Jacek。
【解决方案2】:

区别在于:

  • text 是 Spark 1.6 中的内置输入格式
  • com.databricks.spark.csv 是 Spark 1.6 中的第三方包

要使用第三方 Spark CSV(Spark 2.0 不再需要),您必须按照spark-csv 网站上的说明进行操作,例如提供

 --packages com.databricks:spark-csv_2.10:1.5.0  

使用spark-submit / pyspark 命令进行论证。

除此之外,sqlContext.read.formatName(...)sqlContext.read.format("formatName")sqlContext.read.load(..., format=formatName) 的语法糖。

【讨论】:

    猜你喜欢
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    • 2012-02-06
    相关资源
    最近更新 更多