DataFrameReader从一个表读取,然后写入另一个

时间:2018-09-23 02:18:06

标签: dataframe pyspark

使用PySpark DataFrameReader我正在尝试从RDS表读取并写入Redshift表。

我能够从csv读取并写入表,如下所示:

df = spark.read \
        .format("com.databricks.spark.csv") \
        .option("header", "true") \
        .option("inferSchema", "true") \
        .load(s3_source_location)

jdbcconf = glueContext.extract_jdbc_conf(GLUE_CONNECTION_NAME)

df.write.format("jdbc") \
    .option("url", jdbcconf.get("url") + '/' + REDSHIFT_DATABASE + '?user=' + jdbcconf.get('user') + '&password=' + jdbcconf.get('password')) \
    .option("dbtable", REDSHIFT_TABLE_NAME) \
    .option("tempdir", args["TempDir"]) \
    .partitionBy("Ingestion_Date") \
    .mode("overwrite") \
    .save()

但是,我想从Rs中读取,而不是从csv中读取,我尝试如下操作:

RDS_CONNECTION_NAME = args['GlueConnectionRDS']
RDS_DATABASE = args['RDSDatabase']
RDS_TABLE_NAME = args['RDSTable']

jdbcconf = glueContext.extract_jdbc_conf(RDS_CONNECTION_NAME)

df  = spark.read.format("jdbc") \
    .option("url", jdbcconf.get("url") + '/' + RDS_DATABASE + '?user=' + jdbcconf.get('user') + '&password=' + jdbcconf.get('password')) \
    .option("dbtable", RDS_TABLE_NAME)

REDSHIFT_CONNECTION_NAME = args['GlueConnectionRedshift']
REDSHIFT_DATABASE = args['RedshiftDatabase']
REDSHIFT_TABLE_NAME = args['RedshiftTable']

jdbcconf = glueContext.extract_jdbc_conf(REDSHIFT_CONNECTION_NAME)

df.write.format("jdbc") \
    .option("url", jdbcconf.get("url") + '/' + REDSHIFT_DATABASE + '?user=' + jdbcconf.get('user') + '&password=' + jdbcconf.get('password')) \
    .option("dbtable", REDSHIFT_TABLE_NAME) \
    .option("tempdir", args["TempDir"]) \
    .mode("overwrite") \
    .save()

从逻辑上讲,我希望它能正常工作,但是我肯定缺少有关DataFrameReader的知识。我收到一条错误消息:

AttributeError:“ DataFrameReader”对象没有属性“ write”。

如果我尝试通过.load()调用和驱动程序进行读取,如下所示:

df  = spark.read.format("jdbc") \
    .option("url", jdbcconf.get("url") + '/' + RDS_DATABASE + '?user=' + jdbcconf.get('user') + '&password=' + jdbcconf.get('password') + '/') \
    .option("dbtable", RDS_TABLE_NAME) \
    .option("inferSchema", "true") \
    .option("driver", 'org.postgresql.Driver') \
    .load()

虽然我知道我的连接有效,但是却收到验证错误。 正确的做法是什么?

0 个答案:

没有答案