使用Spark读取SAS sas7bdat数据

时间:2018-08-21 13:07:25

标签: apache-spark pyspark sas

我有一个SAS表,我尝试用Spark读取它。我尝试像这样使用https://github.com/saurfang/spark-sas7bdat,但无法正常工作。

代码如下:

from pyspark.sql import SQLContext

sqlContext = SQLContext(sc)
df = sqlContext.read.format("com.github.saurfang.sas.spark").load("my_table.sas7bdat")

它返回此错误:

Py4JJavaError: An error occurred while calling o878.load.
: java.lang.ClassNotFoundException: Failed to find data source: com.github.saurfang.sas.spark. Please find packages at http://spark.apache.org/third-party-projects.html
at org.apache.spark.sql.execution.datasources.DataSource$.lookupDataSource(DataSource.scala:635)
at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:190)
at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:174)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
at py4j.Gateway.invoke(Gateway.java:282)
at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
at py4j.commands.CallCommand.execute(CallCommand.java:79)
at py4j.GatewayConnection.run(GatewayConnection.java:238)
at java.lang.Thread.run(Unknown Source)

Caused by: java.lang.ClassNotFoundException: com.github.saurfang.sas.spark.DefaultSource
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$23$$anonfun$apply$15.apply(DataSource.scala:618)
at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$23$$anonfun$apply$15.apply(DataSource.scala:618)
at scala.util.Try$.apply(Try.scala:192)
at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$23.apply(DataSource.scala:618)
at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$23.apply(DataSource.scala:618)
at scala.util.Try.orElse(Try.scala:84)
at org.apache.spark.sql.execution.datasources.DataSource$.lookupDataSource(DataSource.scala:618)...

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

该软件包似乎未正确导入。运行--packages saurfang:spark-sas7bdat:2.0.0-s_2.10spark-submit时必须使用pyspark。参见:https://spark-packages.org/package/saurfang/spark-sas7bdat

您还可以从该页面下载JAR文件,并使用--jars /path/to/jar

运行pyspark或spark-submit命令。

答案 1 :(得分:0)

我尝试了以上两种方法,但对我却没有用,因为即使df.count()也无法访问数据框,并引发错误。我有一个5768 X 6432数据框。

解决方案: 使用您选择的定界符将sas7bdat转换为平面文件CSV或txt,我已经使用管道定界符在txt上完成了此操作,因为我的数据可能会有逗号。

阅读sas7bdat并使用它来获取架构。

df= spark.read.format("com.github.saurfang.sas.spark").load("PATH/SAS_DATA.sas7bdat")
vartype = df.schema

现在在读取txt文件时通过此架构

df2 = spark.read.format('csv').option('header','True').option('delimiter','|').schema(vartype).load("path/SAS_DATA.txt")

为我工作

答案 2 :(得分:0)

我刚刚在 R 中解决了这个问题,我敢打赌我的 2 美分在这里也是同样的问题。问题似乎是 com.github.saurfang.sas.spark 的正确存储库不可用/未指定。应该是 https://repos.spark-packages.org/

我们都被难住了,因为这里(和在 R 中)控制台的错误只是提供了一些信息并且与这部分有关

Failed to find data source: com.github.saurfang.sas.spark

当我在 cmd 中运行对 spark-submit 的 R 调用时(我使用的是 Windows),低头看,它显示了尝试从各种缓存和存储库下载 com.github.saurfang.sas.spark 的尝试,但是不是上面提到的那个..

因此解决了所有问题,导致调用和下载 spark 包(在 R 中使用 sparklyr)。

spark-submit2.cmd --driver-memory 32G --name sparklyr --class sparklyr.Shell --packages "saurfang:spark-sas7bdat:2.0.0-s_2.11" --repositories https://repos.spark-packages.org/ "...\sparklyr\java\sparklyr-2.0-2.11.jar" 8880 41823