通过spark-redshift工具包读取redshift上的表

来源:互联网 发布:mysql时间戳类型长度 编辑:程序博客网 时间:2024/05/18 23:54

spark数据源API在spark1.2以后,开始提供插件诗的机制,并与各种结构化数据源整合。spark 用户可以读取各种各样数据源的数据,比如Hive表、JSON文件、列式的Parquet表、以及其他表。通过spark包可以获取第三方数据源。
而这篇文章主要讨论spark 新的数据源,通过spark-redshift包,去访问Amazon Redshift服务。
spark-redshift 包主要由Databricks以及来自SwiftKey社区贡献者和其他公司维护。
在诞生 spark-redshift之前,spark JDBC数据源是唯一可以访问Redshift库。这种方式在查询非常少的数据(比如100条)的情况下是非常适合的,但是如果用于处理大规模数据,将会变得非常慢!这是因为JDBC提供基于ResultSet方法,使用单线程获取小批量数据。
此外,如果使用JDBC在Redshift中存储大规模的数据集,唯一可行的方式就是在Redshift中同一个数据库中进行。基于JDBC的INSERT/UPDATE查询也仅仅适合小规模的数据。对于那些想在Redshift中加载或者存储大规模数据的用户来说,JDBC实在是有太多的性能和吞吐量问题亟待改变。
然而使用spark-redshift可以简化和Redshift整合的步骤,使得我们可以从Redshift中加载或者存储大规模的数据。为了了解它是怎么工作的,让我们来看看如何用Redshift数据库来和其他的数据源的数据集进行集成。
我们还将在本文探讨spark-redshift是如何扩展的。一般情况下,数据需要从HDFS上移到Redshift中进行分析。然而spark-redshift将允许Redshift无缝地操作(通过统一的数据源API)存储在S3、Hive tables、CSV或者存储在HDFS上的Parquet文件。这将使得ETL工作变得简单,用户只需要将注意力放在业务逻辑上,而且这提供了统一的系统视图。

从Redshift读取数据

假如你想要使用spark处理一张完整表(或查询返回大规模数据行),与另一个大数据集比如是hive数据源整合。如下是使用Redshift表查询数据,然后转成DataFrame操作:

val jdbcURL =  """jdbc:redshift://test-redshift.czac2vcs84ci.                  us-east-.redshift.amazonaws.com:5439/                  testredshift?user=redshift&                 password= W9P3GC42GJYFpGxBitxPszAc8iZFW"""val tempS3Dir = "s3n://spark-redshift-testing/temp/"val salesDF = sqlContext.read    .format("com.databricks.spark.redshift")    .option("url", jdbcURL) //Provide the JDBC URL    .option("tempdir", tempS3Dir) //User provides a temporary S3 folder    .option("dbtable", "sales") //or use .option("query",”select * from sales”)     .load()

上面命令提供一个DataFrame实例查询Redshift表。使用者只需要提供JDBC URL、用于缓存Redshift表数据的S3上面的临时文件夹以及需要查询表的名字。
在spark中DataFrame实例可注册为临时表,然后直接执行查询操作。

salesDF.registerTempTable("sales_from_redshift")val newSalesDF = sqlContext.sql("SELECT count(*) FROM sales_from_redshift")

下面使用SQL命令行接口(CLI)可以获取同样的结果:

CREATE TEMPORARY TABLE sales_from_redshiftUSING com.databricks.spark.redshiftOPTIONS (dbtable 'sales',tempdir 's3n://spark-redshift-testing/temp/',url 'jdbc:redshift://test-redshift.czac2vcs84ci.us-east-.redshift.amazonaws.com:5439/testredshift?user=redshift&password=W9P3GC42GJYFpGxQtaCBitxPszAc8iZFW');SELECT count(*) FROM sales_from_redshift;

在Spark中,我们将查询的Redshift表注册成一个名为sales_from_redshift的临时表,我们可以直接在这个名字的表上进行查询:

SELECT count(*) FROM sales_from_redshift;

在这个语句的背后,spark-redshift执行Redshift的UNLOAD命令来并行地复制Redshift上表的数据,并缓存在用户指定的S3文件夹中。然后使用Hadoop InputFormat API来并行地读取这些存储在S3上面的文件,并将它映射成RDD实例。最后它利用JDBC元数据检索功能来将被检索表的模式生成DataFrame实例。如下图所示:
这里写图片描述
spark-redshift工具包并不能自动删除存储在S3上面的文件。所以我们建议使用S3上专门用于临时存放文件的地方来存放文件,使得这些临时文件可以在指定时间后自动删除。


写数据到Redshift

spark 数据源API是一个强有力ETL工具。在大数据系统中一种常用操作是从一个系统中获取大规模数据,然后在这些数据上分布式地进行分布式操作,最终存入另一个系统中。例如,一般我们常见的从Hive数据表去读数据,然后将表中的数据复制到Redshift中,以便允许我们进行交互式地处理。spark-redshift工具包特别适合这种应用场景。

假如我们可以直接在Spark环境中读取Hive中表的数据,然后我们需要将这些数据拷贝到Redshift相应的redshift_transaction表中,我们可以进行如下操作:

sqlContext.sql("SELECT * FROM transaction")          .write.format("com.databricks.spark.redshift")          .option("url", jdbcURL)          .option("tempdir", tempS3Dir)           .option("dbtable", "redshift_transaction")           .mode(SaveMode.Overwrite)          .save()

使用SQL CLI也可以达到相同的目的,如下:

CREATE TABLE redshift_transactionUSING com.databricks.spark.redshiftOPTIONS (dbtable 'redshift_transaction',tempdir 's3n://spark-redshift-testing/temp/',url 'jdbc:redshift://test-redshift.czac2vcs84ci.us-east-.redshift.amazonaws.com:5439/testredshift?user=redshift&password=W9P3GC42GJYFpGxQtaCBitxPszAc8iZFW')AS SELECT * FROM transaction;

SaveMode.Overwrite模式,表示如果表存储,直接覆盖。默认在在SQL CLI模式,表示如果表存在,将抛出异常。而SaveMode.ErrorIfExists模式这也是SaveMode.Append模式表示如果表不存在那就创建一张表,否则就追加数据。最后一种模式是SaveMode.Ignore,表示如果不存在表那就创建表,如果表存在,那忽略整个命令操作。

在这个语句的背后,在写数据的时候,spark-redshift工具包将使用JDBC首先在Redshift 中创建表,然后它将分区好的RDD复制到S3临时目录中;最后,它允许Redshift的COPY命令分布式的来将S3上保存的数据复制到Redshift相应的表中。如下图所述:

这里写图片描述


整合其他数据源

通过spark-redshift工具包读取的数据将自动地转换成DataFrame对象。
spark 核心是大型数据集的抽象。这可以促进数据源之间的互操作性,因为类型自动转换为spark的标准表示(例如StringType DecimalType)
Redshift用户可以将存储在S3上的Redshift表和存储在HDFS上的Hive表、CSV或者Parquet进行Join操作。这个特性对用户来说是非常重要的。


使用spark-redshift

在这表文章介绍spark-redshift,提供一个概述如何解析将Redshift整合到spark数据处理平台。为了尝试使用这些新的特性,下载spark1.5或者注册Databricks账号来使用试用期。我们也听过非常详细的教程。这个教程将会指导您完成创建一个示例Redshift的数据库。然后显示通过spark-redshift包从本机的开发环境如何与Redshift数据库交互操作。


原文来自于:https://databricks.com/blog/2015/10/19/introducing-the-spark-redshift-package.html

0 0
原创粉丝点击