Ошибка усечения данных в задании склеивания aws при передаче данных с S3 на Aurora

#python #amazon-web-services #aws-glue-data-catalog #aws-glue-spark #aws-glue-workflow

Вопрос:

Я пытаюсь перенести свои данные из корзины S3 (address.csv) в AWS Aurora (MySQL) с помощью AWS Glue. Когда я использую следующий скрипт для передачи, один из столбцов с именем «po_box_number», который представляет собой переменную длиной 10, выдает мне сообщение об ошибке: «При вызове o195.pyWriteDynamicFrame произошла ошибка. Усечение данных: Данные слишком длинные для столбца «po_box_number» в строке 1″. Когда я увеличил размер столбца в целях диагностики, я увидел, что данные хранятся в формате json. Предположим, что мне нужно значение «100», оно хранится как {«длинный»: 100, «строка»: null}, аналогично, если я попытаюсь сохранить «E101», оно хранится как {«длинный»: null, «строка»: «E101»}

 import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
from datetime import datetime
from pyspark.sql.functions import lit
from awsglue.dynamicframe import DynamicFrame

## @params: [JOB_NAME]
args = getResolvedOptions(sys.argv, ['JOB_NAME'])

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)
## @type: DataSource
## @args: [database = "db1", table_name = "tb1", transformation_ctx = "datasource0"]
## @return: datasource0
## @inputs: []
datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "db1", table_name = "tb1", transformation_ctx = "datasource0")   

#applymapping1 = Map.apply(frame = datasource0, f = AddProcessedTime)

applymapping1 = ApplyMapping.apply(frame = applymapping1, mappings = [("col6", "string", "po_box_number", "string")], transformation_ctx = "applymapping1")

#applymapping1 = ResolveChoice.apply(applymapping1, specs = [("po_box_number", "cast:string")])
datasink5 = glueContext.write_dynamic_frame.from_catalog(frame = applymapping1, database = "db1", table_name = "tb2", transformation_ctx = "datasink5")
job.commit()
 

Комментарии:

1. Все ли значения для каждого столбца в файле address.csv одного и того же типа? Можете ли вы попробовать небольшое подмножество с простыми значениями, чтобы убедиться, что оно работает?

2. В файле address.csv есть несколько столбцов (все они строкового типа, и один из них является промежуточным), и «po_box_number» — единственный столбец, в котором возникает эта проблема. Даже несмотря на то, что есть столбец с именем «street_name», который содержит символы varchar (идентичные номеру po_box_number), и он отлично работает

3. хм, я предполагаю, что в csv должна быть какая-то несогласованная точка данных, можете ли вы попробовать с первыми 5 строками и только с 3 столбцами? Каков минимальный жизнеспособный csv, который может работать с преобразованием

4. Спасибо @BanjoObayomi! Похоже, в моей корзине S3 есть некоторые поврежденные данные, которые отвечали за преобразование в json. Как только я его убрал, все пошло так, как и ожидалось

Ответ №1:

Похоже, в моей корзине S3 есть некоторые поврежденные данные, которые отвечали за преобразование в json. Как только я его убрал, все пошло так, как и ожидалось

Комментарии:

1. Привет, Парт, у меня аналогичное требование-загрузить несколько csv-файлов из S3 в Aurora с помощью клея. Я довольно новичок в AWS, не могли бы вы помочь мне с наилучшим подходом для этого сценария