查询亚马逊使用砖红移

你可以读和写表从亚马逊与砖红移。

请注意

你可能更喜欢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。如果你计划执行多个查询相同的数据在红移,砖建议提取的数据保存使用三角洲湖

请注意

你不应该创建一个红移集群内部砖VPC,因为它会导致管理权限的问题由于砖VPC的安全模型。您应该创建自己的VPC,然后执行VPC凝视连接数据砖红移的实例。

配置

验证S3和红移

数据源包括多个网络连接,见下图:

┌───────┐┌───────────────────> S3││<─────────────────┐│我或键└───────┘我或键││^││││我或键v v┌──────v────┐┌────────────┐┌───────────┐│┌──────────┴┐│红移││火花│││火花│││<──────────>││司机<────────> |执行人│└────────────┘└───────────┘└───────────┘JDBC与配置用户名/密码火花(默认启用SSL)

数据源读取和写入数据传输数据时S3 /红移。因此,它需要AWS凭证与读和写访问一个S3 bucket(指定使用tempdir配置参数)。

请注意

数据源不清理临时文件创建在S3中。因此,我们建议你使用一个专门的临时用一个S3 bucket对象生命周期配置以确保临时文件后自动删除指定的保质期。看到加密部分的本文档讨论如何加密这些文件。

以下部分描述每个连接的身份验证配置选项:

火花司机红移

火花司机通过JDBC连接到红移使用用户名和密码。红移不支持我角色的使用这个连接进行身份验证。默认情况下,此连接使用SSL加密;更多细节,请参阅加密

火花S3

充当中介S3存储大量数据读取或写入红移。火花连接到S3使用Hadoop文件系统接口和直接使用Amazon S3 Java SDK的客户端。

请注意

您不能使用DBFS挂载配置访问S3的红移。

  • 默认凭据提供程序链(最好的选择对于大多数用户):自动检索通过AWS凭证DefaultAWSCredentialsProviderChain。如果你使用实例配置文件验证S3,那么你应该使用这种方法。

    以下提供凭证优先于这个默认的方法。

  • 通过假设一个我的角色:你可以用一个实例配置文件可以假设我的角色。指定角色的攻击,你必须实例配置文件附加到集群,并提供以下配置密钥:

    schadoopConfiguration(“fs.s3a.credentialsType”,“AssumeRole”)schadoopConfiguration(“fs.s3a.stsAssumeRole.arn”,<- - - - - -角色- - - - - -在攻击- - - - - -- - - - - -- - - - - -假定>)/ /一个可选的时间,表示为一个数量和单位/ /时间,如“15米”或“1 h”schadoopConfiguration(“fs.s3a.assumed.role.session.duration”,<持续时间>)
    sc_jschadoopConfiguration()(“fs.s3a.credentialsType”,“AssumeRole”)sc_jschadoopConfiguration()(“fs.s3a.stsAssumeRole.arn”,<- - - - - -角色- - - - - -在攻击- - - - - -- - - - - -- - - - - -假定>)#一个可选的时间,表示为一个数量和单位15 #时间,如“m”或“1 h”sc_jschadoopConfiguration()(“fs.s3a.assumed.role.session.duration”,<持续时间>)
  • 在Hadoop设置键配置:您可以指定使用AWS键Hadoop配置属性。如果你的tempdir配置指向一个s3a: / /文件系统,您可以设置fs.s3a.access.keyfs.s3a.secret.key属性在Hadoop XML配置文件或电话sc.hadoopConfiguration.set ()配置Hadoop引发的全球配置。如果你使用一个s3n: / /文件系统,您可以提供遗留配置键,如以下示例所示。

    例如,如果您正在使用s3a文件系统,添加:

    schadoopConfiguration(“fs.s3a.access.key”,“< your-access-key-id >”)schadoopConfiguration(“fs.s3a.secret.key”,“< your-secret-key >”)

    的遗产s3n文件系统,添加:

    schadoopConfiguration(“fs.s3n.awsAccessKeyId”,“< your-access-key-id >”)schadoopConfiguration(“fs.s3n.awsSecretAccessKey”,“< your-secret-key >”)

    下面的命令依靠一些火花内部,但应与所有PySpark版本和将来不太可能改变:

    sc_jschadoopConfiguration()(“fs.s3a.access.key”,“< your-access-key-id >”)sc_jschadoopConfiguration()(“fs.s3a.secret.key”,“< your-secret-key >”)

红移到S3

红移也连接到S3复制卸载查询。这个连接进行身份验证的方法有三种:

  • 有红移假设一个我的角色(最安全):你可以授予红移许可期间承担了我的角色复制orgydF4y2Ba卸载操作,然后配置数据源指示红移使用这些角色:

    1. 创建一个给予你适当的S3权限斗我的角色。

    2. 跟着导游授权亚马逊红移来访问其他AWS服务代表你配置这个角色的信任策略为了让红移承担这个角色。

    3. 遵循的步骤使用我的角色授权复制和卸载操作指导助理,我的角色和你的红移集群。

    4. 设置数据源aws_iam_role选择角色的攻击。

  • 火花的S3凭证红移:如果forward_spark_s3_credentials选项设置为真正的然后数据源自动发现火花的凭证是用来连接到S3和转发这些凭证在JDBC红移。如果火花验证S3使用实例配置文件然后一组临时STS证书转发给红移;否则,AWS密钥转发。JDBC查询嵌入这些凭据因此砖强烈建议您启用SSL加密的JDBC连接时使用此身份验证方法。

  • 使用安全令牌服务(STS)凭证:你可以配置temporary_aws_access_key_id,temporary_aws_secret_access_key,temporary_aws_session_token配置属性指向临时密钥通过AWS创建的安全令牌服务。因此JDBC查询嵌入这些凭证强烈推荐启用SSL加密的JDBC连接时使用此身份验证方法。如果您选择这个选项然后意识到这种风险,证书到期前读/写操作成功。

这三个选项是相互排斥的,您必须显式地选择使用哪一个。

加密

  • 确保JDBC:除非存在任何SSL-related设置JDBC URL,也默认数据源支持SSL加密和验证红移服务器是值得信赖的(也就是说,sslmode = verify-full)。,从亚马逊服务器自动下载服务器证书第一次。如果失败,预捆绑的证书文件作为后备。这适用于红移和PostgreSQL JDBC驱动程序。介绍了自动SSL配置2.1.1-db4集群形象(不支持);之前的版本并不自动配置SSL和使用默认的JDBC驱动程序的配置(SSL禁用)。

    这个功能有问题,或者你只是想禁用SSL,您可以调用.option (“autoenablessl”,“假”)在你的DataFrameReaderorgydF4y2BaDataFrameWriter

    如果你想指定自定义SSL-related设置,您可以按照红移的说明文档:在Java中使用SSL和服务器证书JDBC驱动程序的配置选项任何SSL-related选项出现在JDBCurl优先考虑使用数据源(即自动配置不会触发)。

  • 加密存储在S3中卸载数据(数据存储当阅读从红移):根据红移的文档卸载数据S3”,自动卸载加密数据文件使用Amazon S3服务器端加密(SSE-S3)。”

    红移也支持与自定义客户端加密密钥(见:卸载加密的数据文件),但缺乏能力的数据源指定所需的对称密钥。

  • 加密存储在S3中复制数据(数据存储在写红移):根据红移的文档从Amazon S3加载加密的数据文件:

您可以使用复制命令加载数据文件上传与AWS-managed Amazon S3使用服务器端加密加密密钥(SSE-S3或SSE-KMS),客户端加密,或两者兼而有之。复制不支持Amazon S3与客供服务器端加密密钥(SSE-C)。

使用此功能,配置您的Hadoop文件系统使用S3Amazon S3加密。这将不加密清单写文件,其中包含所有文件的列表。

参数

火花中提供的参数映射或选择SQL支持以下设置:

参数

要求

默认的

描述

数据表

是的,除非指定查询。

没有一个

表创建或从红移。这个参数时需要保存数据回红移。

查询

是的,除非指定数据表。

没有一个

查询阅读从红移。

用户

没有

没有一个

红移的用户名。必须配合使用密码选项。可以使用只有在用户和密码不通过在URL中,都将导致一个错误。用户名包含特殊字符时使用这个参数需要转义。

密码

没有

没有一个

红移的密码。必须配合使用用户选择。可以使用只有在用户名和密码并不是通过在URL中;通过将导致一个错误。使用这个参数时,密码包含特殊字符需要转义。

url

是的

没有一个

JDBC URL的格式

jdbc: subprotocol: / / <主机>:<口> /数据库?用户= <用户名>密码= <密码>

subprotocol可以postgresqlorgydF4y2Ba红移,这取决于你加载JDBC驱动程序。一个Redshift-compatible司机必须在类路径中,匹配这个URL。主机港口应该指出,红移主节点,所以安全组和/或VPC必须配置为允许访问从你的驱动程序。数据库标识一个红移数据库名称用户密码凭据来访问数据库,必须嵌入在这对JDBC URL,和您的用户账户应该有必要的权限表被引用。

search_path

没有

没有一个

设置模式搜索路径在红移。将使用吗search_path命令。应该是一个逗号分隔的列表模式名称搜索表。看到红移的文档search_path

aws_iam_role

只有在使用我的角色授权。

没有一个

完全指定的攻击我红移复制/卸载操作的角色例如,集群与红移攻击:aws:我::123456789000:角色/ < redshift-iam-role >

forward_spark_s3_credentials

没有

如果真正的,数据源自动发现火花的凭证是用来连接到S3和转发这些凭证在JDBC红移。这些凭据发送作为JDBC查询的一部分,因此强烈建议启用SSL加密的JDBC连接时使用此选项。

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

没有

甚至

红移分布的风格当创建一个表。可以是其中一个甚至,关键orgydF4y2Ba所有(见红移文档)。当使用关键,你必须设置一个分布键distkey选项。

distkey

不,除非使用DISTSTYLE关键

没有一个

表中的列的名称作为主要分布在创建一个表。

sortkeyspec

没有

没有一个

一个完整的红移排序关键字定义。例子包括:

  • SORTKEY (my_sort_column)

  • 复合SORTKEY (sort_col_1sort_col_2)

  • 交叉SORTKEY (sort_col_1sort_col_2)

usestagingtable(弃用)

没有

真正的

设置这个弃用选项导致一个覆盖操作的目标表立即下降的开始写,使覆盖非原子操作,减少目标表的可用性。这可能减少临时磁盘空间需求覆盖。

因为设置usestagingtable = false操作风险数据丢失或不可用,弃用的需要您手动删除目标表。

描述

没有

没有一个

一个描述表。将使用SQL命令发表评论,而且应该出现在大多数的查询工具。看到也描述元数据描述单个列上。

预作用

没有

没有一个

一个;分离在装货前执行的SQL命令列表复制命令。它有可能是有用的删除命令或类似的运行在加载新数据。如果命令包含% s在执行前,表名是格式化的(如果你使用staging表)。

被警告说,如果这些命令失败,它被视为一个错误,抛出异常。如果使用一个临时表,更改恢复和备份表恢复以前如果行动失败。

postactions

没有

没有一个

一个;分离的SQL命令列表成功后执行复制当加载数据。它有可能是有用的格兰特命令或类似的运行时加载新数据。如果命令包含% s在执行前,表名是格式化的(如果你使用staging表)。

被警告说,如果这些命令失败,它被视为一个错误,抛出异常。如果使用一个临时表,更改恢复和备份表恢复如果行动失败。

extracopyoptions

没有

没有一个

额外的选项列表添加到红移复制例如,命令加载数据时TRUNCATECOLUMNSorgydF4y2BaMAXERRORn(见红移文档其他选项)。

因为这些选项添加到年底复制命令,只选择有意义的最后命令可以使用,但是这应该覆盖最可能的用例。

tempformat

没有

AVRO

在S3中保存临时文件的格式写作时红移。默认为AVRO;其他允许的值CSVCSVGZIP分别为CSV和gzip CSV。

红移明显比装船时Avro装船时更快的CSV文件,所以使用tempformat可能提供了一个巨大的性能提升写作时红移。

csvnullstring

没有

@NULL@

的字符串值为null当使用CSV tempformat写。这应该是一个值,不出现在你的实际数据。

csvseparator

没有

,

分隔符用在编写与tempformat设置为临时文件CSVorgydF4y2BaCSVGZIP。这一定是一个有效的ASCII字符,例如,“,”或“|”。

csvignoreleadingwhitespace

没有

真正的

当设置为true时,除去前导空格在值时写道tempformat被设置为CSVorgydF4y2BaCSVGZIP。否则,保留空白。

csvignoretrailingwhitespace

没有

真正的

当设置为true时,删除空格时从价值观中写道tempformat被设置为CSVorgydF4y2BaCSVGZIP。否则,保留空白。

infer_timestamp_ntz_type

没有

如果真正的、价值类型的红移时间戳被解读为TimestampNTZType在读取(时间戳没有时区)。否则,所有的时间戳都解释为TimestampType无论在底层的红移表类型。

额外的配置选项

配置字符串列的最大大小

在创建红移表时,默认行为是创建文本列字符串列。红移的商店文本列如VARCHAR (256),所以这些列的最大大小是256字符()。

支持更大的列,可以使用最大长度列元数据字段指定单个字符串的最大长度列。这也是有用的实现节省空间的性能优化,宣布与最大长度小于默认列。

请注意

由于火花,限制SQL和R语言api不支持列元数据修改。

df=# dataframe你会想写红移#指定自定义每一列的宽度columnLengthMap={“language_code”:2,“country_code”:2,“url”:2083年,}#每一列元数据应用定制(colName,长度)columnLengthMapiteritems():元数据={最大长度的:长度}df=dfwithColumn(colName,df(colName]别名(colName,元数据=元数据))df\格式(“com.databricks.spark.redshift”)\选项(“url”,jdbcURL)\选项(“tempdir”,s3TempDirectory)\选项(“数据表”,sessionTable)\保存()

这里有一个例子更新多个列的元数据字段使用火花的Scala API:

进口orgapache火花sql类型MetadataBuilder/ /指定自定义每一列的宽度瓦尔columnLengthMap=地图(“language_code”- >2,“country_code”- >2,“url”- >2083年)vardf=/ / dataframe你会想写红移/ /每一列元数据应用定制columnLengthMapforeach{情况下(colName,长度)= >瓦尔元数据=MetadataBuilder()。putLong(“最大长度”,长度)。构建()df=dfwithColumn(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)columnTypeMapiteritems():元数据={“redshift_type”:colType}df=dfwithColumn(colName,df(colName]别名(colName,元数据=元数据))
进口orgapache火花sql类型MetadataBuilder/ /指定自定义类型的每一列瓦尔columnTypeMap=地图(“language_code”- >“CHAR (2)”,“country_code”- >“CHAR (2)”,“url”- >“BPCHAR (111)”)vardf=/ / dataframe你会想写红移/ /每一列元数据应用定制columnTypeMapforeach{情况下(colName,colType)= >瓦尔元数据=MetadataBuilder()。putString(“redshift_type”,colType)。构建()df=dfwithColumn(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驱动程序:

  1. 下载司机从亚马逊。

  2. 上传司机砖工作区。

  3. 安装图书馆在你的集群。

请注意

砖推荐使用最新版本的红移的JDBC驱动程序。下面的红移JDBC驱动程序版本1.2.41有以下限制:

  • 驱动程序的版本1.2.16返回空数据时使用在哪里条款一个SQL查询。

  • 驱动程序的版本低于1.2.41可能返回无效的结果,因为一个列的nullability错误报告为“不空”而不是“未知”。

事务担保

本节描述红移的事务保证数据源的火花。

一般背景红移和S3属性

红移事务担保一般信息,请参阅管理并发写操作章的红移的文档。简而言之,红移可序列化的隔离根据文档的红移开始命令:

(虽然)您可以使用任何的四个事务隔离级别,亚马逊红移处理所有隔离级别是可序列化的。

根据红移的文档:

亚马逊支持一个默认的红移自动提交行为,每个separately-executed SQL命令单独提交。

因此,个人的命令复制卸载原子和事务,而显式开始结束应该只需要执行多个命令或查询的原子性。

当读取或写入红移,在S3中读取和写入数据的数据源。火花和红移产生分区的输出并将其存储在S3的多个文件。根据Amazon S3数据一致性模型文档,S3 bucket清单操作最终一致性的,所以必须去特别的文件长度,避免丢失或不完整的数据由于最终一致性的来源。

保证红移数据源的火花

附加到一个现有表

当行插入红移,使用的数据源复制命令并指定体现防止某些最终一致性的S3操作。作为一个结果,spark-redshift附加到现有表有相同的原子作为常规的红移和事务属性复制命令。

创建一个新表(SaveMode.CreateIfNotExists)

创建一个新表是一个两步的过程,组成的创建命令之后复制命令来添加初始设置的行。操作都是在同一事务中执行。

覆盖现有的表

默认情况下,数据源使用事务进行覆盖,实现删除目标表,创建一个新的空表,添加行。

如果弃用usestagingtable设置被设置为提交,数据来源删除命令行添加新表之前,牺牲覆盖操作的原子性但减少红移的暂存空间需要覆盖。

查询红移表

查询使用红移卸载命令执行一个查询和结果保存到S3和使用体现防止某些最终一致性的S3操作。因此,从红移数据源查询火花应该有相同的一致性属性作为普通红移的查询。

常见问题和解决方案

S3 bucket和红移集群不同的AWS区域

默认情况下,S3 < - >红移副本不工作如果S3 bucket和红移在AWS不同区域集群。

如果你尝试读一个红移表S3 bucket时在不同的地区,你会看到一个错误,如:

错误:S3ServiceException: S3 bucket解决不同地区的查询从这个集群。PermanentRedirect地位301年,错误。

同样,试图编写使用S3 bucket红移在不同的地区可能会导致以下错误:

错误:问题阅读清单文件——S3ServiceException: S3 bucket解决不同地区的查询从这个集群。PermanentRedirect地位301年,错误
  • 写道:红移复制命令支持的明确规范S3 bucket地区,所以你可以写在这些情况下通过添加红移正常工作地区“the-region-name”extracopyoptions设置。例如,一桶在美国东部(弗吉尼亚州)地区和Scala API,使用:

    选项(“extracopyoptions”,“地区us-east-1”)

    或者可以使用awsregion设置:

    选项(“awsregion”,“us-east-1”)
  • 写着:红移卸载命令还支持S3 bucket地区的明确规范。你可以读通过增加该地区的正常工作awsregion设置:

    选项(“awsregion”,“us-east-1”)

意想不到的S3ServiceException凭证错误当你使用S3实例配置文件进行身份验证

如果您使用的是实例配置文件验证S3和接收一个意想不到的S3ServiceException错误,检查是否AWS访问中指定键tempdirS3 URI, Hadoop配置,或任何来源检查DefaultAWSCredentialsProviderChain:那些资源优先于实例配置文件凭证。

错误消息,这是一个样品可以的症状钥匙不小心将优先于实例配置文件:

com.amazonaws.services.s3.model。一个mazonS3Exception: The AWS Access Key Id you provided does not exist in our records. (Service: Amazon S3; Status Code: 403; Error Code: InvalidAccessKeyId;

身份验证错误当使用一个密码与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驱动程序的配置

时间戳和时区的语义

在读取数据时,两个红移时间戳TIMESTAMPTZ数据类型映射到火花TimestampType,和一个值转化为协调世界时(UTC)和存储为UTC时间戳。对于一个红移时间戳假设,当地时区值没有任何时区信息。写数据到一个红移表时,火花TimestampType映射到红移时间戳数据类型。

迁移向导

现在需要您显式地设置的数据源forward_spark_s3_credentials火花S3凭证之前转发给红移。如果你使用这种变化没有影响aws_iam_roleorgydF4y2Batemporary_aws_ *身份验证机制。然而,如果你依赖于旧的默认行为你现在必须显式地设置forward_spark_s3_credentials真正的继续使用以前的红移S3身份验证机制。为三个身份验证机制的讨论及其安全的权衡,看到验证S3和红移本文的部分。