Ошибка удаления строк в AWS Glue с нулевыми значениями - PullRequest
0 голосов
/ 15 февраля 2019

В настоящее время возникла проблема с приложением AWS Glue Job, которое читает коллекцию S3 и записывает ее в AWS Redshift, где у нас есть столбец со значениями null.

Задание должно быть достаточно простым, и большая часть кода автоматически генерируется интерфейсом Glue, но поскольку в Redshift у нас нет пустых столбцов, которые иногда бывают нулевыми в нашем наборе данных, мы не можем получить заданиезавершено.

Ниже показана сокращенная версия кода, код на Python и среда PySpark.

datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "db_1", table_name = "table_1", transformation_ctx = "datasource0")

resolvedDDF = datasource0.resolveChoice(specs = [
  ('price_current','cast:double'),
  ('price_discount','cast:double'),
])

applymapping = ApplyMapping.apply(frame = resolvedDDF, mappings = [
  ("id", "string", "id", "string"), 
  ("status", "string", "status", "string"), 
  ("price_current", "double", "price_current", "double"), 
  ("price_discount", "double", "price_discount", "double"), 
  ("created_at", "string", "created_at", "string"), 
  ("updated_at", "string", "updated_at", "string"), 
], transformation_ctx = "applymapping")

droppedDF = applymapping.toDF().dropna(subset=('created_at', 'price_current'))

newDynamicDF = DynamicFrame.fromDF(droppedDF, glueContext, "newframe")

dropnullfields = DropNullFields.apply(frame = newDynamicDF, transformation_ctx = "dropnullfields")

datasink = glueContext.write_dynamic_frame.from_jdbc_conf(frame = dropnullfields, catalog_connection = "RedshiftDataStaging", connection_options = {"dbtable": "dbtable_1", "database": "database_1"}, redshift_tmp_dir = args["TempDir"], transformation_ctx = "datasink")

У нас есть ненулевое ограничение на price_current и created_at таблица в Redshift и из-за некоторых ранних ошибок в нашей системе некоторые записи достигли корзины S3 без необходимых данных.Мы хотим просто отбросить эти строки, так как они составляют очень небольшой процент от общих данных для обработки.

Несмотря на код dropna, мы все равно получаем следующую ошибку из Redshift.

Error (code 1213) while loading data into Redshift: "Missing data for not-null field"
Table name: "PUBLIC".table_1
Column name: created_at
Column type: timestampt(0)
Raw field value: @NULL@

1 Ответ

0 голосов
/ 18 февраля 2019

Вы можете передать значения по умолчанию, если не хотите их удалять

df = dropnullfields.toDF ()

df = df.na.fill ({'price_current': 0.0,' creation_at ':' '})

dyf = DynamicFrame.fromDF (df,' glue_context_1 ')

datasink = glueContext.write_dynamic_frame.from_jdbc_conf (frame = dyf, каталог"RedshiftDataStaging", connection_options = {"dbtable": "dbtable_1", "database": "database_1"}, redshift_tmp_dir = args ["TempDir"], translation_ctx = "datasink")

Если выхотите удалить, используйте следующий код вместо df.na.fill

df = df.na.drop (subset = ["price_current", "creation_at"])

...