从MySQL读取位数据类型并使用AWS胶水转换为红移时出现问题

从MySQL读取位数据类型并使用AWS胶水转换为红移时出现问题,mysql,pyspark,aws-glue,Mysql,Pyspark,Aws Glue,我在MySQL数据库中有一个表,其中包含一个名为activity的列,该列的数据类型为BIT。当转换为INT时,它可以采用1、2或3的值 在AWS Glue中使用爬虫程序时,它将活动识别为布尔值。我试图编辑表的模式,并将activity的数据类型更改为INT,但Glue在运行作业时仍将其读取为布尔值 我还尝试使用ApplyMapping将其转换为INT,但没有成功 关于如何解决这个问题有什么想法吗?您可以使用spark/pySpark代码来读取MySQL数据库中的表。 例如,使用pySpark将

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

在AWS Glue中使用爬虫程序时,它将
活动
识别为布尔值。我试图编辑表的模式,并将
activity
的数据类型更改为INT,但Glue在运行作业时仍将其读取为布尔值

我还尝试使用ApplyMapping将其转换为INT,但没有成功


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

您可以使用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在推断模式方面比AWS Glue做得好得多。

我通过向下推MySQL数据库的查询解决了这个问题,在将其读入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()

我已经尝试过在
spark.read.format('jdbc')
中使用这种方法,但它仍然将列读取为布尔值。还有其他建议吗?首先,如果源列的值为1、2、3等,则源列的
activity
应该是INT而不是BIT。通常,类型BIT用于布尔值,因此,这就是为什么可能一直将其作为布尔值读取的原因。除此之外,您还可以尝试在写入Redshift之前更改元数据上的数据类型。是的,但是由于其他应用程序用例,源列是INT。另一方面,我知道如何将其用于BI和分析目的。我还尝试在写入Redshift之前更改元数据。问题仍然是从数据库读取时,
活动
列被识别为BOOLEN。因此,当我尝试将它转换为INT时,它只将True/False转换为1/0。有没有其他方法可以解决这个问题?我真的很感谢你的帮助。在我的情况下,数据类型是“tinyint”。但AWS Glue仍将其视为布尔值。有没有办法处理这个问题?@SujaiSivasamy-将
?tinyInt1isBit=false
添加到您的连接字符串中,如:
jdbc:mysql://localhost:3306/dbname?tinyInt1isBit=false