通过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
- 通过spark-redshift工具包读取redshift上的表
- redshift
- redshift的约束策略
- 解决spark-redshift只能写不能读的问题
- Redshift扩容及踩到的坑
- ubuntu下 保护眼睛的RedShift
- ubuntu下 保护眼睛的RedShift
- Redshift vs f.lux
- redshift 学习总结
- Redshift SQL 基本语句
- f.lux & redshift
- Redshift 性能测试(一)
- amazon redshift 系统架构
- redshift 优化官方文档
- 数据平台架构基于AWS的使用总结- Redshift优劣
- AWS云数据仓库Redshift,让您的数据飞起来
- OLAP: Hive, Impala and Redshift
- REDSHIFT性能优化-QUERYID-1301108
- java中如何创建自己的类加载器详解
- Android Studio 自定义属性
- iOS推送基本原理
- selinux 查看 关闭
- hdoj 1069 Monkey and Banana【dp】
- 通过spark-redshift工具包读取redshift上的表
- 在vector的循环中调用erase
- libevent代码阅读(2)——尾队列的学习
- 新生记
- eclipse中文语言包 离线安装
- 可替代CSS3 transition和transform的jQuery插件
- phpmyadmin 配置文件权限错误,无法写入!
- 线性表的动态分配顺序存储结构
- leetcode18 4sum