Apache spark 使用Spark读取SAS sas7bdat数据

Apache spark 使用Spark读取SAS sas7bdat数据,apache-spark,pyspark,sas,Apache Spark,Pyspark,Sas,我有一张SAS表格,我试着用Spark阅读它。我试着像这样使用它,但我无法让它工作 代码如下: 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 ca

我有一张SAS表格,我试着用Spark阅读它。我试着像这样使用它,但我无法让它工作

代码如下:

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)...

有什么想法吗?

看起来软件包没有正确导入。运行
spark submit
pyspark
时,您必须使用
-软件包saurfang:spark-sas7bdat:2.0.0-s_2.10
。见:


您也可以从该页面下载JAR文件,并使用
--jars/path/to/JAR运行pyspark或spark submit命令,我尝试了上述两种方法,但都不适用,因为数据帧即使对于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")

对我有效

这是怎么回答这个问题的?对我来说,这更像是一个新的主题。这似乎只是因为需要为相应的sas7bdat文件创建文本版本,但最终它确实解决了使用相同模式读取sas7bdat文件的问题。简单地通过saurfang读取sas7bdat数据对我来说并不正确,但确实如此。您是否添加了任何包来读取sas7bdat文件?是的,在启动spark submit spark submit时加载saurfang包spark submit--包saurfang:spark-sas7bdat:2.0.0-s_2.10