查询亚马逊使用砖红移
你可以读和写表从亚马逊与砖红移。
请注意
你可能更喜欢Lakehouse联盟管理查询红移。看到使用Lakehouse联合运行查询。
砖红移的数据源使用Amazon S3来有效地传输数据的红移,使用JDBC来自动触发适当的复制
和卸载
红移的命令。
请注意
在砖运行时的11.2及以上,砖运行时包含了红移的JDBC驱动程序,可以使用红移
关键字的格式选项。看到砖的运行时版本驱动程序版本包含在每个砖运行时。用户提供的司机仍然支持,优先于捆绑JDBC驱动程序。
在砖运行时的11.1和下面,手动安装红移的JDBC驱动程序是必需的,和查询应该使用驱动程序(com.databricks.spark.redshift
)的格式。看到红移驱动程序安装。
使用
下面的例子演示结合红移的司机。取代url
参数值,如果你使用PostgreSQL JDBC驱动程序。
一旦你有了配置你的AWS证书,您可以使用火花数据源的数据源API在Python中,SQL, R,或Scala:
#从一个表读取数据df=(火花。读。格式(“红移”)。选项(“数据表”,table_name)。选项(“tempdir”,“s3a: / / <桶> / <目录路径>”)。选项(“url”," jdbc:红移:/ / < database-host-url >”)。选项(“用户”,用户名)。选项(“密码”,密码)。选项(“forward_spark_s3_credentials”,真正的)。负载())#读取数据的查询df=(火花。读。格式(“红移”)。选项(“查询”,“选择x, count (*) < your-table-name > group by x”)。选项(“tempdir”,“s3a: / / <桶> / <目录路径>”)。选项(“url”," jdbc:红移:/ / < database-host-url >”)。选项(“用户”,用户名)。选项(“密码”,密码)。选项(“forward_spark_s3_credentials”,真正的)。负载())#应用转换到数据之后,您可以使用#数据源API来编写回到另一个表的数据#写回到一个表(df。写。格式(“红移”)。选项(“数据表”,table_name)。选项(“tempdir”,“s3a: / / <桶> / <目录路径>”)。选项(“url”," jdbc:红移:/ / < database-host-url >”)。选项(“用户”,用户名)。选项(“密码”,密码)。模式(“错误”)。保存())#使用我编写回表基于角色的验证(df。写。格式(“红移”)。选项(“数据表”,table_name)。选项(“tempdir”,“s3a: / / <桶> / <目录路径>”)。选项(“url”," jdbc:红移:/ / < database-host-url >”)。选项(“用户”,用户名)。选项(“密码”,密码)。选项(“aws_iam_role”,“攻击:aws:我::123456789000:角色/ redshift_iam_role”)。模式(“错误”)。保存())
使用SQL读取数据:
下降表如果存在redshift_table;创建表redshift_table使用红移选项(数据表“<表名称>”,tempdir“s3a: / / <桶> / <目录路径>”,url“jdbc:红移:/ / < database-host-url >”,用户“<用户名>”,密码“<密码>”,forward_spark_s3_credentials“真正的”);选择*从redshift_table;
使用SQL编写数据:
下降表如果存在redshift_table;创建表redshift_table_new使用红移选项(数据表“<新的表名>”,tempdir“s3a: / / <桶> / <目录路径>”,url“jdbc:红移:/ / < database-host-url >”,用户“<用户名>”,密码“<密码>”,forward_spark_s3_credentials“真正的”)作为选择*从table_name;
SQL API只支持创建新表,而不是覆盖或附加。
读取数据使用R:
df< -read.df(零,“com.databricks.spark.redshift”,tempdir=“s3a: / / <你的水桶> / < your-directory-path >”,数据表=“< your-table-name >”,url=" jdbc:红移:/ / < the-rest-of-the-connection-string >”)
/ /读取数据从一个表中瓦尔df=火花。读。格式(“红移”)。选项(“数据表”,table_name)。选项(“tempdir”,“s3a: / / <桶> / <目录路径>”)。选项(“url”," jdbc:红移:/ / < database-host-url >”)。选项(“用户”,用户名)。选项(“密码”,密码)。选项(“forward_spark_s3_credentials”,真正的)。负载()/ /读取数据的查询瓦尔df=火花。读。格式(“红移”)。选项(“查询”,“选择x, count (*) < your-table-name > group by x”)。选项(“tempdir”,“s3a: / / <桶> / <目录路径>”)。选项(“url”," jdbc:红移:/ / < database-host-url >”)。选项(“用户”,用户名)。选项(“密码”,密码)。选项(“forward_spark_s3_credentials”,真正的)。负载()/ /转换应用到数据之后,您可以使用/ /数据源API来编写回到另一个表的数据/ /写一个表df。写。格式(“红移”)。选项(“数据表”,table_name)。选项(“tempdir”,“s3a: / / <桶> / <目录路径>”)。选项(“url”," jdbc:红移:/ / < database-host-url >”)。选项(“用户”,用户名)。选项(“密码”,密码)。模式(“错误”)。保存()/ /写回表使用我基于角色的验证df。写。格式(“红移”)。选项(“数据表”,table_name)。选项(“tempdir”,“s3a: / / <桶> / <目录路径>”)。选项(“url”," jdbc:红移:/ / < database-host-url >”)。选项(“用户”,用户名)。选项(“密码”,密码)。选项(“aws_iam_role”,“攻击:aws:我::123456789000:角色/ redshift_iam_role”)。模式(“错误”)。保存()
建议使用红移
查询执行可能提取大量数据S3。如果你计划执行多个查询相同的数据在红移,砖建议提取的数据保存使用三角洲湖。
配置
验证S3和红移
数据源包括多个网络连接,见下图:
┌───────┐┌───────────────────> S3││<─────────────────┐│我或键└───────┘我或键││^││││我或键v v┌──────v────┐┌────────────┐┌───────────┐│┌──────────┴┐│红移││火花│││火花│││<──────────>││司机<────────> |执行人│└────────────┘└───────────┘└───────────┘JDBC与配置用户名/密码火花(默认启用SSL)
数据源读取和写入数据传输数据时S3 /红移。因此,它需要AWS凭证与读和写访问一个S3 bucket(指定使用tempdir
配置参数)。
以下部分描述每个连接的身份验证配置选项:
火花S3
充当中介S3存储大量数据读取或写入红移。火花连接到S3使用Hadoop文件系统接口和直接使用Amazon S3 Java SDK的客户端。
请注意
您不能使用DBFS挂载配置访问S3的红移。
在Hadoop设置键配置:您可以指定使用AWS键Hadoop配置属性。如果你的
tempdir
配置指向一个s3a: / /
文件系统,您可以设置fs.s3a.access.key
和fs.s3a.secret.key
属性在Hadoop XML配置文件或电话sc.hadoopConfiguration.set ()
配置Hadoop引发的全球配置。如果你使用一个s3n: / /
文件系统,您可以提供遗留配置键,如以下示例所示。例如,如果您正在使用
s3a
文件系统,添加:sc。hadoopConfiguration。集(“fs.s3a.access.key”,“< your-access-key-id >”)sc。hadoopConfiguration。集(“fs.s3a.secret.key”,“< your-secret-key >”)
的遗产
s3n
文件系统,添加:sc。hadoopConfiguration。集(“fs.s3n.awsAccessKeyId”,“< your-access-key-id >”)sc。hadoopConfiguration。集(“fs.s3n.awsSecretAccessKey”,“< your-secret-key >”)
下面的命令依靠一些火花内部,但应与所有PySpark版本和将来不太可能改变:
sc。_jsc。hadoopConfiguration()。集(“fs.s3a.access.key”,“< your-access-key-id >”)sc。_jsc。hadoopConfiguration()。集(“fs.s3a.secret.key”,“< your-secret-key >”)
红移到S3
设置forward_spark_s3_credentials
选项真正的
自动向前AWS关键凭证火花是使用连接到S3 / JDBC红移。JDBC查询嵌入这些凭据因此砖强烈建议您启用SSL加密的JDBC连接。
加密
确保JDBC:除非存在任何SSL-related设置JDBC URL,也默认数据源支持SSL加密和验证红移服务器是值得信赖的(也就是说,
sslmode = verify-full
)。,从亚马逊服务器自动下载服务器证书第一次。如果失败,预捆绑的证书文件作为后备。这适用于红移和PostgreSQL JDBC驱动程序。介绍了自动SSL配置_;之前的版本并不自动配置SSL和使用默认的JDBC驱动程序的配置(SSL禁用)。这个功能有问题,或者你只是想禁用SSL,您可以调用
.option (“autoenablessl”,“假”)
在你的DataFrameReader
orgydF4y2BaDataFrameWriter
。如果你想指定自定义SSL-related设置,您可以按照红移的说明文档:在Java中使用SSL和服务器证书和JDBC驱动程序的配置选项任何SSL-related选项出现在JDBC
url
优先考虑使用数据源(即自动配置不会触发)。加密存储在S3中卸载数据(数据存储当阅读从红移):根据红移的文档卸载数据S3”,自动卸载加密数据文件使用Amazon S3服务器端加密(SSE-S3)。”
红移也支持与自定义客户端加密密钥(见:卸载加密的数据文件),但缺乏能力的数据源指定所需的对称密钥。
加密存储在S3中复制数据(数据存储在写红移):根据红移的文档从Amazon S3加载加密的数据文件:
您可以使用复制
命令加载数据文件上传与AWS-managed Amazon S3使用服务器端加密加密密钥(SSE-S3或SSE-KMS),客户端加密,或两者兼而有之。复制不支持Amazon S3与客供服务器端加密密钥(SSE-C)。
参数
火花中提供的参数映射或选择SQL支持以下设置:
参数 |
要求 |
默认的 |
描述 |
---|---|---|---|
数据表 |
是的,除非指定查询。 |
没有一个 |
表创建或从红移。这个参数时需要保存数据回红移。 |
查询 |
是的,除非指定数据表。 |
没有一个 |
查询阅读从红移。 |
用户 |
没有 |
没有一个 |
红移的用户名。必须配合使用密码选项。可以使用只有在用户和密码不通过在URL中,都将导致一个错误。用户名包含特殊字符时使用这个参数需要转义。 |
密码 |
没有 |
没有一个 |
红移的密码。必须配合使用 |
url |
是的 |
没有一个 |
JDBC URL的格式 jdbc: subprotocol: / / <主机>:<口> /数据库?用户= <用户名>密码= <密码>
|
search_path |
没有 |
没有一个 |
设置模式搜索路径在红移。将使用吗 |
aws_iam_role |
只有在使用我的角色授权。 |
没有一个 |
完全指定的攻击我红移复制/卸载操作的角色例如,集群与红移 |
forward_spark_s3_credentials |
没有 |
|
如果 |
temporary_aws_access_key_id |
没有 |
没有一个 |
AWS访问密钥,必须写权限S3 bucket。 |
temporary_aws_secret_access_key |
没有 |
没有一个 |
AWS秘密访问密钥对应提供访问密钥。 |
temporary_aws_session_token |
没有 |
没有一个 |
AWS会话令牌对应提供访问密钥。 |
tempdir |
是的 |
没有一个 |
可写的位置在Amazon S3,用于卸载数据阅读和Avro数据加载到写作时红移。如果你使用红移数据源火花作为常规的ETL管道的一部分,它可以有用的设置生命周期策略一桶和使用它作为一个临时的位置数据。 |
jdbcdriver |
没有 |
由JDBC URL的subprotocol决定。 |
要使用JDBC驱动程序的类名。这个类必须在类路径中。在大多数情况下,它应该不需要指定这个选项,作为适当的驱动程序类名应该自动由JDBC URL的subprotocol。 |
diststyle |
没有 |
|
红移分布的风格当创建一个表。可以是其中一个 |
distkey |
不,除非使用 |
没有一个 |
表中的列的名称作为主要分布在创建一个表。 |
sortkeyspec |
没有 |
没有一个 |
一个完整的红移排序关键字定义。例子包括:
|
usestagingtable(弃用) |
没有 |
|
设置这个弃用选项 因为设置 |
描述 |
没有 |
没有一个 |
一个描述表。将使用SQL命令发表评论,而且应该出现在大多数的查询工具。看到也 |
预作用 |
没有 |
没有一个 |
一个 被警告说,如果这些命令失败,它被视为一个错误,抛出异常。如果使用一个临时表,更改恢复和备份表恢复以前如果行动失败。 |
postactions |
没有 |
没有一个 |
一个 被警告说,如果这些命令失败,它被视为一个错误,抛出异常。如果使用一个临时表,更改恢复和备份表恢复如果行动失败。 |
extracopyoptions |
没有 |
没有一个 |
额外的选项列表添加到红移 因为这些选项添加到年底 |
tempformat |
没有 |
|
在S3中保存临时文件的格式写作时红移。默认为 红移明显比装船时Avro装船时更快的CSV文件,所以使用tempformat可能提供了一个巨大的性能提升写作时红移。 |
csvnullstring |
没有 |
|
的字符串值为null当使用CSV tempformat写。这应该是一个值,不出现在你的实际数据。 |
csvseparator |
没有 |
|
分隔符用在编写与tempformat设置为临时文件 |
csvignoreleadingwhitespace |
没有 |
|
当设置为true时,除去前导空格在值时写道 |
csvignoretrailingwhitespace |
没有 |
|
当设置为true时,删除空格时从价值观中写道 |
infer_timestamp_ntz_type |
没有 |
|
如果 |
额外的配置选项
配置字符串列的最大大小
在创建红移表时,默认行为是创建文本
列字符串列。红移的商店文本
列如VARCHAR (256)
,所以这些列的最大大小是256字符(源)。
支持更大的列,可以使用最大长度
列元数据字段指定单个字符串的最大长度列。这也是有用的实现节省空间的性能优化,宣布与最大长度小于默认列。
请注意
由于火花,限制SQL和R语言api不支持列元数据修改。
df=…# dataframe你会想写红移#指定自定义每一列的宽度columnLengthMap={“language_code”:2,“country_code”:2,“url”:2083年,}#每一列元数据应用定制为(colName,长度)在columnLengthMap。iteritems():元数据={最大长度的:长度}df=df。withColumn(colName,df(colName]。别名(colName,元数据=元数据))df。写\。格式(“com.databricks.spark.redshift”)\。选项(“url”,jdbcURL)\。选项(“tempdir”,s3TempDirectory)\。选项(“数据表”,sessionTable)\。保存()
这里有一个例子更新多个列的元数据字段使用火花的Scala API:
进口org。apache。火花。sql。类型。MetadataBuilder/ /指定自定义每一列的宽度瓦尔columnLengthMap=地图(“language_code”- >2,“country_code”- >2,“url”- >2083年)vardf=…/ / dataframe你会想写红移/ /每一列元数据应用定制columnLengthMap。foreach{情况下(colName,长度)= >瓦尔元数据=新MetadataBuilder()。putLong(“最大长度”,长度)。构建()df=df。withColumn(colName,df(colName)。作为(colName,元数据))}df。写。格式(“com.databricks.spark.redshift”)。选项(“url”,jdbcURL)。选项(“tempdir”,s3TempDirectory)。选项(“数据表”,sessionTable)。保存()
设置一个自定义列类型
如果你需要手动设置列类型,您可以使用redshift_type
列元数据。例如,如果您希望覆盖火花SQL模式- >红移SQL
类型匹配器来分配一个用户定义的列类型,您可以执行以下操作:
#指定自定义类型的每一列columnTypeMap={“language_code”:“CHAR (2)”,“country_code”:“CHAR (2)”,“url”:“BPCHAR (111)”,}df=…# dataframe你会想写红移#每一列元数据应用定制为(colName,colType)在columnTypeMap。iteritems():元数据={“redshift_type”:colType}df=df。withColumn(colName,df(colName]。别名(colName,元数据=元数据))
进口org。apache。火花。sql。类型。MetadataBuilder/ /指定自定义类型的每一列瓦尔columnTypeMap=地图(“language_code”- >“CHAR (2)”,“country_code”- >“CHAR (2)”,“url”- >“BPCHAR (111)”)vardf=…/ / dataframe你会想写红移/ /每一列元数据应用定制columnTypeMap。foreach{情况下(colName,colType)= >瓦尔元数据=新MetadataBuilder()。putString(“redshift_type”,colType)。构建()df=df。withColumn(colName,df(colName)。作为(colName,元数据))}
配置列编码
当创建一个表,使用编码
列元数据字段指定为每个列(见压缩编码亚马逊文档可用的编码)。
查询下推到红移
火花优化器将以下运营商分成红移:
过滤器
项目
排序
限制
聚合
加入
在项目
和过滤器
它支持以下表达式:
大多数布尔逻辑运算符
比较
基本的算术运算
数字和字符串类型转换
多数字符串函数
标量子查询,如果他们完全可以下推到红移。
请注意
这个叠加不支持表达式操作日期和时间戳。
在聚合
它支持以下聚合函数:
AVG
数
马克斯
最小值
总和
STDDEV_SAMP
STDDEV_POP
VAR_SAMP
VAR_POP
结合截然不同的
条款,适用。
在加入
它支持以下类型的连接:
内心的加入
左外加入
正确的外加入
左半加入
左反加入
子查询重写成
加入
通过优化器。在哪里存在
,在哪里不存在
请注意
加入叠加不支持完整的外加入
。
查询的叠加可能最有益限制
。一个查询等选择*从large_redshift_table限制10
可能需要很长时间,因为整个表将首先被卸载S3作为中间结果。叠加,限制
执行在红移。与聚合查询,将聚合分解成红移也有助于减少需要传输的数据量。
查询下推到红移是默认启用。它可以通过设置禁用spark.databricks.redshift.pushdown
来假
。即使残疾,火花仍然推过滤器和执行列消除分成红移。
红移驱动程序安装
红移的数据源也需要Redshift-compatible JDBC驱动程序。因为红移是基于PostgreSQL数据库系统,您可以使用PostgreSQL JDBC驱动程序附带砖运行时或亚马逊推荐红移的JDBC驱动程序。无需安装使用PostgreSQL JDBC驱动程序。PostgreSQL JDBC驱动程序的版本包含在每个砖砖中列出的运行时版本的运行时发布说明。
手动安装红移JDBC驱动程序:
请注意
砖推荐使用最新版本的红移的JDBC驱动程序。下面的红移JDBC驱动程序版本1.2.41有以下限制:
驱动程序的版本1.2.16返回空数据时使用
在哪里
条款一个SQL查询。驱动程序的版本低于1.2.41可能返回无效的结果,因为一个列的nullability错误报告为“不空”而不是“未知”。
事务担保
本节描述红移的事务保证数据源的火花。
一般背景红移和S3属性
红移事务担保一般信息,请参阅管理并发写操作章的红移的文档。简而言之,红移可序列化的隔离根据文档的红移开始命令:
(虽然)您可以使用任何的四个事务隔离级别,亚马逊红移处理所有隔离级别是可序列化的。
根据红移的文档:
亚马逊支持一个默认的红移自动提交行为,每个separately-executed SQL命令单独提交。
因此,个人的命令复制
和卸载
原子和事务,而显式开始
和结束
应该只需要执行多个命令或查询的原子性。
当读取或写入红移,在S3中读取和写入数据的数据源。火花和红移产生分区的输出并将其存储在S3的多个文件。根据Amazon S3数据一致性模型文档,S3 bucket清单操作最终一致性的,所以必须去特别的文件长度,避免丢失或不完整的数据由于最终一致性的来源。
保证红移数据源的火花
创建一个新表(SaveMode.CreateIfNotExists
)
创建一个新表是一个两步的过程,组成的创建表
命令之后复制命令来添加初始设置的行。操作都是在同一事务中执行。
常见问题和解决方案
S3 bucket和红移集群不同的AWS区域
默认情况下,S3 < - >红移副本不工作如果S3 bucket和红移在AWS不同区域集群。
如果你尝试读一个红移表S3 bucket时在不同的地区,你会看到一个错误,如:
错误:S3ServiceException: S3 bucket解决不同地区的查询从这个集群。PermanentRedirect地位301年,错误。
同样,试图编写使用S3 bucket红移在不同的地区可能会导致以下错误:
错误:问题阅读清单文件——S3ServiceException: S3 bucket解决不同地区的查询从这个集群。PermanentRedirect地位301年,错误
身份验证错误当使用一个密码与JDBC url中的特殊字符
如果你是提供用户名和密码作为JDBC url的一部分和密码包含特殊字符,如;
,吗?
,或&
,你可能会看到以下例外:
java.sql。SQLException: [Amazon](500310) Invalid operation: password authentication failed for user 'xyz'
这是由于特殊字符的用户名或密码不正确逃脱的JDBC驱动程序。一定要使用相应的DataFrame指定用户名和密码的选项用户
和密码
。有关更多信息,请参见参数。
长时间运行的火花查询挂下去即使相应的红移操作就完成了
如果你是读或写大量的数据从红移,火花查询可能无限期挂,即使AWS红移监测页面显示相应的负载
orgydF4y2Ba卸载
操作已完成,集群是空闲的。这是由于红移之间的联系和引发超时。为了避免这种情况,确保tcpKeepAlive
启用JDBC国旗TCPKeepAliveMinutes
被设置为一个较低的值(例如,1)。
有关更多信息,请参见亚马逊红移JDBC驱动程序的配置。
迁移向导
现在需要您显式地设置的数据源forward_spark_s3_credentials
火花S3凭证之前转发给红移。如果你使用这种变化没有影响aws_iam_role
orgydF4y2Batemporary_aws_ *
身份验证机制。然而,如果你依赖于旧的默认行为你现在必须显式地设置forward_spark_s3_credentials
来真正的
继续使用以前的红移S3身份验证机制。为三个身份验证机制的讨论及其安全的权衡,看到验证S3和红移本文的部分。