Чтение данных SAS sas7bdat с помощью Spark
У меня есть таблица 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 ответа
Похоже, что пакет был импортирован неправильно. Вы должны использовать --packages saurfang:spark-sas7bdat:2.0.0-s_2.10
при беге spark-submit
или же pyspark
, Смотрите: https://spark-packages.org/package/saurfang/spark-sas7bdat
Вы также можете загрузить файл JAR с этой страницы и запустить команду pyspark или spark-submit с помощью --jars /path/to/jar
Я только что разобрал эту проблему в R и держу пари, что мои 2 цента, здесь та же проблема. Проблема, похоже, в том, что правильный репозиторий для недоступен / не указан. Так должно быть
https://repos.spark-packages.org/
Мы все в тупике, потому что ошибка консоли здесь (и в R) лишь немного информативна и относится к этой части.
Failed to find data source: com.github.saurfang.sas.spark
Когда я запустил вызов R для spark-submit в cmd (я использую Windows), low-and-behold, он показал попытки загрузить
com.github.saurfang.sas.spark
из различных кешей и репозиториев, но не из упомянутого выше.
Таким образом, исправление всего этого привело к вызову и загрузке пакета Spark (с использованием sparklyr в R).
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
Я пробовал два вышеуказанных метода, но у меня это не сработало, так как фрейм данных недоступен даже для 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")
Работает на меня