从 MySQL 读取位数据类型并使用 AWS Glue 转换为 Redshift 的问题
Posted
技术标签:
【中文标题】从 MySQL 读取位数据类型并使用 AWS Glue 转换为 Redshift 的问题【英文标题】:Problem with reading bit data type from MySQL and transformation into Redshift with AWS Glue 【发布时间】:2018-10-25 14:59:56 【问题描述】:我在 mysql 数据库中有一个表,其中包含一个名为 activity
的列,其数据类型为 BIT。当转换为 INT 时,它可以取值 1,2 或 3。
在 AWS Glue 中使用爬网程序时,它会将 activity
识别为 BOOLEAN。我尝试编辑表的架构并将 activity
的数据类型更改为 INT,但 Glue 在运行作业时仍将其读取为 BOOLEAN。
我也尝试使用 ApplyMapping 将其转换为 INT 但没有成功。
关于如何解决这个问题的任何想法?
【问题讨论】:
【参考方案1】:我通过向 MySQL 数据库下推一个查询来解决这个问题,我在将 BIT 读入 Glue 时将其转换为 INT:
pushdown_query = "(SELECT col1, CAST(activity AS INT) AS activity FROM my_table) my_table"
df = glueContext.read.format("jdbc")\
.option("driver", "com.mysql.jdbc.Driver") \
.option("url", db_url) \
.option("dbtable", pushdown_query) \
.option("user", db_user) \
.option("password", db_pass).load()
【讨论】:
【参考方案2】:您可以改用 spark/pySpark 代码来读取 MySQL 数据库中的表。 例如,使用 pySpark 如下:
jdbcUrl = "jdbc:mysql://0:1/2".format(jdbcHostname, jdbcPort, jdbcDatabase)
connectionProperties =
"user" : jdbcUsername,
"password" : jdbcPassword,
"driver" : "com.mysql.jdbc.Driver"
employees_table = spark.read.jdbc(jdbcUrl, "employees", connectionProperties)
您可以在此链接上找到更多信息:Spark Data Sources 希望 spark 在推断架构方面比 AWS Glue 做得更好。
【讨论】:
我已经尝试将该方法与spark.read.format('jdbc')
一起使用,但它仍然将该列读取为布尔值。还有其他建议吗?
首先,如果您的源列activity
的值为 1、2、3 等,则应该是 INT 而不是 BIT。通常,BIT 类型用于布尔值,所以,那就是为什么可能会一直将其读取为布尔值。除此之外,您还可以在写入 Redshift 之前尝试更改元数据的数据类型。 docs.databricks.com/spark/latest/data-sources/aws/…
是的,但是由于其他应用程序用例,源列是一个 INT。另一方面,我将它用于商业智能和分析目的。我还尝试在写入 Redshift 之前更改元数据。问题仍然是activity
列在从数据库中读取时被识别为 BOOLEN。因此,当我尝试将其转换为 INT 时,它只会将 True/False 转换为 1/0。我可以使用其他方法来解决这个问题吗?非常感谢您的帮助。
在我的例子中,数据类型是“tinyint”。 AWS Glue 仍将其视为布尔值。有什么办法处理吗?
@SujaiSivasamy - 将?tinyInt1isBit=false
添加到您的连接字符串中,例如:jdbc:mysql://localhost:3306/dbname?tinyInt1isBit=false
以上是关于从 MySQL 读取位数据类型并使用 AWS Glue 转换为 Redshift 的问题的主要内容,如果未能解决你的问题,请参考以下文章
如何使用Lambda从Amazon AWS中提取和转换单个dynamodb元素
AWS Glue - 从 sql server 表中读取并作为自定义 CSV 文件写入 S3
使用 AWS Glue 从 S3 读取动态 DataTpes
创建新的 AWS RDS 实例并导入数据,而不是将 MySQL 版本从 5.6 更新到 5.7