从选项(来自 rds - mysql)创建动态框架,提供带有 where 子句的自定义查询

Posted

技术标签:

【中文标题】从选项(来自 rds - mysql)创建动态框架,提供带有 where 子句的自定义查询【英文标题】:Create dynamic frame from options (from rds - mysql) providing a custom query with where clause 【发布时间】:2020-02-16 18:48:07 【问题描述】:

我想在我的 Glue 作业中从 Aurora-rds mysql 表创建一个 DynamicFrame。我可以使用自定义查询从我的 rds 表创建 DynamicFrame - 有 where 子句吗? 我不想每次都在我的 DynamicFrame 中读取整个表格,然后再过滤。 看了这个网站,但在这里或其他地方没有找到任何选项,https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-connect.html

构造 JDBC 连接选项

connection_mysql5_options = "url": "jdbc:mysql://:3306/db", “dbtable”:“测试”, “用户”:“管理员”, “密码”:“密码”

从 MySQL 5 读取 DynamicFrame

df_mysql5 =glueContext.create_dynamic_frame.from_options(connection_type="mysql", connection_options=connection_mysql5_options)

有没有办法给出一个 where 子句并说只从测试表中选择前 100 行,说它有一个名为“id”的列,我想使用这个查询来获取:

select * from test where id

感谢任何帮助。谢谢!

【问题讨论】:

我今天找到了这个,可能也是你要找的东西***.com/questions/51388993/… 【参考方案1】:

我能够提供自定义查询的方式是创建一个 Spark DataFrame 并使用选项指定它: https://spark.apache.org/docs/2.3.0/sql-programming-guide.html#manually-specifying-options

然后使用所述类将该 DataFrame 转换为 DynamicFrame: https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-pyspark-extensions-dynamic-frame.html

tmp_data_frame = spark.read.format("jbdc")
.option("url", jdbc_url)
.option("user", username)
.option("password", password)
.option("query", "select * from test where id<100")
.load()

dynamic_frame = DynamicFrame.fromDF(tmp_data_frame, glueContext)

【讨论】:

【参考方案2】:

抱歉,我会发表评论,但我没有足够的声誉。我能够使 Guillermo AMS 提供的解决方案在 AWS Glue 中工作,但它确实需要进行两项更改:

“jdbc”格式无法识别(提供的错误为:“py4j.protocol.Py4JJavaError:调用 o79.load 时出错。 :java.lang.ClassNotFoundException:找不到数据源:jbdc。请在http://spark.apache.org/third-party-projects.html" 找到包)——我必须使用全名:“org.apache.spark.sql.execution.datasources.jdbc.JdbcRelationProvider” 查询选项对我不起作用(提供的错误是:“py4j.protocol.Py4JJavaError:调用 o72.load 时发生错误。 : java.sql.SQLSyntaxErrorException: ORA-00911: invalid character"),但幸运的是,“dbtable”选项支持传入表或子查询——即在查询周围使用括号。

在下面的解决方案中,我还围绕所需的对象和导入添加了一些上下文。 我的解决方案最终看起来像:

from awsglue.context import GlueContext
from pyspark.context import SparkContext

glue_context = GlueContext(SparkContext.getOrCreate())

tmp_data_frame = glue_context.spark_session.read\
  .format("org.apache.spark.sql.execution.datasources.jdbc.JdbcRelationProvider")\
  .option("url", jdbc_url)\
  .option("user", username)\
  .option("password", password)\
  .option("dbtable", "(select * from test where id<100)")\
  .load()

【讨论】:

以上是关于从选项(来自 rds - mysql)创建动态框架,提供带有 where 子句的自定义查询的主要内容,如果未能解决你的问题,请参考以下文章

无法从 MySQL Workbench 连接到 RDS MySQL 数据库

RDS for MySQL有哪些限制

创建新的 AWS RDS 实例并导入数据,而不是将 MySQL 版本从 5.6 更新到 5.7

将Mysql数据从一个账户的RDS自动复制到另一个账户的RDS

AWS 新建RDS实例 for MySQL

AWS RDS极光 - 通过boto3或aws cli创建跨区域读取副本