apache-spark - 使用 spark-redshift 插入 Redshift

标签 apache-spark amazon-redshift amazon-redshift-spectrum

我正在尝试从 S3( Parquet 文件)插入 Redshift 数据。通过 SQLWorkbench 完成它需要 46 秒来处理 600 万行。但是通过连接器 spark-redshift 完成它大约需要 7 分钟。

我正在尝试使用更多节点并获得相同的结果。

有什么改进使用 spark-redshift 的时间的建议吗?

Spark 中的代码:

val df = spark.read.option("basePath", "s3a://parquet/items").parquet("s3a://parquet/items/Year=2017/Month=7/Day=15")

df.write
      .format("com.databricks.spark.redshift")
      .option("url", "jdbc:....")
      .option("dbtable", "items")
      .option("tempdir", "s3a://parquet/temp")
      .option("aws_iam_role", "...")
      .option("sortkeyspec", "SORTKEY(id)")
      .mode(SaveMode.Append)
      .save()

SQLWorkbench(Redshift SQL)中的代码:

CREATE EXTERNAL TABLE items_schema.parquet_items("id type, column2 type....")
ROW FORMAT DELIMITED FIELDS TERMINATED BY '|'
STORED AS PARQUET
LOCATION 's3://parquet/items/Year=2017/Month=7/Day=15';

CREATE TABLE items ("id type, column2 type....");

INSERT INTO items (SELECT * FROM items_schema.parquet_items); 

最佳答案

我会说你的代码片段标签错误:

  • 这是 Spark 代码 val df = spark.read ...
  • 这是 Redshift SQL CREATE EXTERNAL TABLE…

当您使用外部表 (Redshift Spectrum) 时,它会执行以下操作:

  • 读取定义位置的 parquet 数据。
  • 将数据插入到正常的 Redshift 表中,如图所示。

当您使用 Spark 代码将数据写入 Redshift 时,使用 spark-redshift,它会执行以下操作:

  • Spark 将 parquet 文件从 S3 读取到 Spark 集群中。
  • Spark 将 parquet 数据转换为 Avro 格式并将其写入 S3。
  • Spark 向 Redshift 发出一个 COPY SQL 查询来加载数据。
  • Redshift 将 Avro 数据从 S3 加载到最终表。

基本上 Spark 代码做了更多的工作,读取数据两次并以不同的格式写入两次。 Redshift Spectrum SQL 读取数据一次并将其写入 Redshift 本身(比通过网络发送到 S3 快得多)。

关于apache-spark - 使用 spark-redshift 插入 Redshift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48661901/

相关文章:

sql - 在 athena 上正常工作时,数据在 redshift 外部表上显示为 null

scala - org.apache.spark.sql.Row 到 Int

scala - 将 cassandra 行映射到 Spark RDD 中的参数化类型

amazon-web-services - 亚马逊 Redshift : Finding and fixing a skewed DISTKEY

php - 是否可以使用 PHP 的 PDO Postgres 驱动程序查询 AWS Redshift?

amazon-web-services - Redshift Spectrum 的性能问题

java - 如何在 Spark 数据集中保存嵌套或 JSON 对象并转换为 RDD?

java - Spark 中的任务失败并出现 ClassNotFoundException

sql - 亚马逊 Redshift 中的列/总和(列)

amazon-web-services - 尝试访问 Amazon Redshift 外部表时出错