从 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

当我们从 s3 中的 csv 文件读取数据并在 aws athena 中创建表时如何跳过标题。

使用 C# 从 AWS 上的 S3 读取 Avro 数据