从 MySQL 读取位数据类型并使用 AWS Glue 转换为 Redshift 时出现问题

Problem with reading bit data type from MySQL and transformation into Redshift with AWS Glue

我在 MySQL 数据库中有一个 table,其中包含名为 activity 的列,数据类型为 BIT。当转换为 INT 时,它可以取值 1,2 或 3。

在 AWS Glue 中使用爬网程序时,它会将 activity 识别为 BOOLEAN。我试图编辑 table 的架构并将 activity 的数据类型更改为 INT 但当 运行 作业时,Glue 仍将其读取为 BOOLEAN。

我也试过用 ApplyMapping 把它转换成 INT 但没有成功。

关于如何解决这个问题有什么想法吗?

您可以改用 spark/pySpark 代码来读取 MySQL 数据库中的 table。 例如,使用 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)

您可以找到关于此的更多信息link:Spark Data Sources 希望 Spark 在推断模式方面比 AWS Glue 做得更好。

我通过将查询下推到 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()