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

时间:2017-12-05 02:11:38

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

我只是尝试将文本文件读入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

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

2 个答案:

答案 0 :(得分:3)

  

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

uri = "mongodb://usernamen:password@host:port/admin" conn = pymongo.MongoClient(uri) db = conn['admin'] db_stats = db.command({'replSetGetStatus' :1}) primary_optime = 0 secondary_optime = 0 for key in db_stats['members'] : if key['stateStr'] == 'SECONDARY' : secondary_optime = key['optimeDate'] if key['stateStr'] == 'PRIMARY' : primary_optime =key['optimeDate'] print 'primary_optime : ' + str(primary_optime) print 'secondary_optime : ' + str(secondary_optime) seconds_lag = (primary_optime - secondary_optime ).total_seconds() #total_seconds() userd to get the lag in seconds rather than datetime object print 'secondary_lag : ' + str(seconds_lag) 假设sqlContext.read.load为数据源格式,parquet采用sqlContext.read.text格式。

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

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

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

  

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

这可以解释为什么你感到困惑,因为你可能一直在使用Spark 1.6.x并且没有加载Spark包以获得format支持。

  

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

sqlContext.read.load Spark包不是Spark的一部分时,

https://spark.apache.org/docs/1.6.1/sql-programming-guide.html适用于Spark 1.6.1。它发生在Spark 2.0中。

  

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

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

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

  

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

事实上,您仍然可以在Spark 2.x中明确使用--packages格式,因为它已在内部得到认可。

答案 1 :(得分: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)的语法糖。