Как написать pyspark-dataframe для красного смещения?

Я пытаюсь записать pyspark DataFrame в Redshift, но это приводит к ошибке: -

java.util.ServiceConfigurationError: org.apache.spark.sql.sources.DataSourceRegister: Provider org.apache.spark.sql.avro.AvroFileFormat не может быть создан

Вызвано: java.lang.NoSuchMethodError: org.apache.spark.sql.execution.datasources.FileFormat. $ Init $ (Lorg / apache / spark / sql / execution / datasources / FileFormat;) V

Версия Spark: 2.4.1

Команда Spark-submit: spark-submit --master local [*] --jars ~ / Downloads / spark-avro_2.12-2.4.0.jar, ~ / Downloads / aws-java-sdk-1.7.4.jar, ~ / Downloads / RedshiftJDBC42-no-awssdk-1.2.20.1043.jar, ~ / Downloads / hadoop-aws-2.7.3.jar, ~ / Downloads / hadoop-common-2.7.3.jar --packages com.databricks: spark-redshift_2.11: 2.0.1, com.amazonaws: aws-java-sdk: 1.7.4, org.apache.hadoop: hadoop-aws: 2.7.3, org.apache.hadoop: hadoop-common: 2.7. 3, org.apache.spark: spark-avro_2.12: 2.4.0 script.py

from pyspark.sql import DataFrameReader
from pyspark.context import SparkContext
from pyspark.sql.session import SparkSession
from pyspark.sql import SQLContext
from pyspark.sql.functions import pandas_udf, PandasUDFType
from pyspark.sql.types import *

import sys
import os

pe_dl_dbname            = os.environ.get("REDSHIFT_DL_DBNAME")
pe_dl_host              = os.environ.get("REDSHIFT_DL_HOST")
pe_dl_port              = os.environ.get("REDSHIFT_DL_PORT")
pe_dl_user              = os.environ.get("REDSHIFT_DL_USER")
pe_dl_password          = os.environ.get("REDSHIFT_DL_PASSWORD")

s3_bucket_path = "s3-bucket-name/sub-folder/sub-sub-folder"
tempdir = "s3a://{}".format(s3_bucket_path)

driver = "com.databricks.spark.redshift"
sc = SparkContext.getOrCreate()
sqlContext = SQLContext(sc)
spark = SparkSession(sc)
spark.conf.set("spark.sql.execution.arrow.enabled", "true")

sc._jsc.hadoopConfiguration().set("fs.s3.impl","org.apache.hadoop.fs.s3native.NativeS3FileSystem")

datalake_jdbc_url = 'jdbc:redshift://{}:{}/{}?user={}&password={}'.format(pe_dl_host, pe_dl_port, pe_dl_dbname, pe_dl_user, pe_dl_password)

"""
The table is created in Redshift as follows:
create table adhoc_analytics.testing (name varchar(255), age integer);
"""
l = [('Alice', 1)]
df = spark.createDataFrame(l, ['name', 'age'])
df.show()
df.write \
  .format("com.databricks.spark.redshift") \
  .option("url", datalake_jdbc_url) \
  .option("dbtable", "adhoc_analytics.testing") \
  .option("tempdir", tempdir) \
  .option("tempformat", "CSV") \
  .save()


person murtaza1983    schedule 04.05.2019    source источник
comment
Если у вас довольно большой файл, также лучше разделить его на более мелкие части, которые соответствуют размеру вашего кластера Redshift, чтобы вы могли воспользоваться преимуществами параллельной обработки Redshift.   -  person simplycoding    schedule 07.05.2019


Ответы (1)


Databricks Spark-Redshift не работает с Spark версии 2.4.1. Вот версия, которую я поддерживаю, чтобы она работала со Spark 2.4.1 https://github.com/goibibo/spark-redshift

Как это использовать:

pyspark --packages "com.github.goibibo: spark-redshift: v4.1.0" --repositories "https://jitpack.io "

person SunnyShah    schedule 04.05.2019