PostgreSQL RDS中用于JSONB列的AWS Glue Crawler

时间:2017-11-30 18:16:37

标签: json postgresql amazon-web-services amazon-s3 aws-glue

我创建了一个爬虫程序,它查看带有JSONB列的PostgreSQL 9.6 RDS表,但爬虫程序将列类型标识为“字符串”。当我尝试创建一个将S3上的JSON文件中的数据加载到RDS表中的作业时,我收到错误。

如何将JSON文件源映射到JSONB目标列?

2 个答案:

答案 0 :(得分:1)

这不是直接的副本,但是对我有用的一种方法是将目标表上的列定义为TEXT。在Glue作业填充字段之后,我将其转换为JSONB。例如:

alter table postgres_table
 alter column column_with_json set data type jsonb using column_with_json::jsonb;

请注意对现有文本数据使用强制类型转换。否则,alter列将失败。

答案 1 :(得分:1)

Crawler 会将 JSONB 列类型识别为“字符串”,但您可以尝试使用 Glue 中的 Unbox Class 将此列转换为 json

让我们在PostgreSQL中查看下表

create table persons (id integer, person_data jsonb, creation_date timestamp )

有一个来自person表的记录的例子

ID = 1
PERSON_DATA = {
               "firstName": "Sergii",
               "age": 99,
               "email":"Test@test.com"
               }
CREATION_DATE = 2021-04-15 00:18:06

以下代码需要在Glue中添加

# 1. create dynamic frame from catalog 
df_persons = glueContext.create_dynamic_frame.from_catalog(database = "testdb", table_name = "persons", transformation_ctx = "df_persons ")
# 2.in path you need to add your jsonb column name that need to be converted to json
df_persons_json = Unbox.apply(frame = df_persons , path = "person_data", format="json")
# 3. converting from dynamic frame to data frame 
datf_persons_json = df_persons_json.toDF()

# 4. after that you can process this column as a json datatype or create dataframe with all necessary columns , each json data element can be added as a separate column in dataframe : 
final_df_person = datf_persons_json.select("id","person_data.age","person_data.firstName","creation_date")

您也可以查看以下链接:

https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-pyspark-transforms-Unbox.html