Ошибка клея AWS: py4j.протокол.Py4JJavaError

#amazon-web-services #aws-glue

Вопрос:

Я получаю эту ошибку в AWS Glue:

«Py4JJavaError: Произошла ошибка при вызове o81.getCatalogSource. java.lang.размышляйте.Исключение InvocationTargetException».

Похоже, что при попытке приведения к строке возникает ошибка. Я клонировал существующую работу и добавил записи жирным шрифтом. Мой первичный ключ-это хэш из dynamodb, поэтому я не могу использовать его в качестве первичного ключа. Однако метка времени всегда должна быть возрастающей, поэтому я хотел сказать Клею, чтобы он использовал ее. Источником является DynamoDB, так как это МОЖЕТ иметь значение.

Моя проблема, безусловно, заключается в дополнительных параметрах из источника данных, так как, если я удалю их, задание будет выполняться нормально (хотя и без закладки). Временная метка отображается как «bigint» в таблицах клея AWS и «длинная» в схеме студии клея aws. По какой-то причине ошибка ссылается на некоторое преобразование в строку, но я не знаю, почему код закладки в дополнительных параметрах приведет к ошибке преобразования в строку.

Измененный Код

 DataSource0 = glueContext.create_dynamic_frame.from_catalog(database = "db", table_name = "table", transformation_ctx = "DataSource0"**, additional_options = {"jobBookmarkKeys":["timestamp"],"jobBookmarkKeysSortOrder":"asc"}**)
 

Соответствующая Ошибка:

 2021-09-20 13:52:30,848 ERROR [main] glue.ProcessLauncher (Logging.scala:logError(73)): Error from Python:Traceback (most recent call last):
  File "/tmp/nnnnn.py", line 23, in <module>
    DataSource0 = glueContext.create_dynamic_frame.from_catalog(database = "db", table_name = "tbl", transformation_ctx = "DataSource0", additional_options = {
    "jobBookmarkKeys": [
        "timestamp"
    ],
    "jobBookmarkKeysSortOrder": "asc"
})
  File "/opt/amazon/lib/python3.6/site-packages/awsglue/dynamicframe.py", line 625, in from_catalog
    return self._glue_context.create_dynamic_frame_from_catalog(db, table_name, redshift_tmp_dir, transformation_ctx, push_down_predicate, additional_options, catalog_id, **kwargs)
  File "/opt/amazon/lib/python3.6/site-packages/awsglue/context.py", line 177, in create_dynamic_frame_from_catalog
    makeOptions(self._sc, additional_options), catalog_id),
  File "/opt/amazon/spark/python/lib/py4j-0.10.9-src.zip/py4j/java_gateway.py", line 1305, in __call__
    answer, self.gateway_client, self.target_id, self.name)
  File "/opt/amazon/spark/python/lib/pyspark.zip/pyspark/sql/utils.py", line 111, in deco
    return f(*a, **kw)
  File "/opt/amazon/spark/python/lib/py4j-0.10.9-src.zip/py4j/protocol.py", line 328, in get_return_value
    format(target_id, ".", name), value)
**py4j.protocol.Py4JJavaError: An error occurred while calling o81.getCatalogSource.
: java.lang.ClassCastException: scala.collection.immutable.$colon$colon cannot be cast to java.lang.String
    at com.amazonaws.services.glue.connections.DynamoConnection.$anonfun$broadcastedConf$1(DynamoConnection.scala:49)
    at com.amazonaws.services.glue.connections.DynamoConnection.$anonfun$broadcastedConf$1$adapted(DynamoConnection.scala:49)**
    at scala.collection.immutable.HashMap$HashMap1.foreach(HashMap.scala:234)
    at scala.collection.immutable.HashMap$HashTrieMap.foreach(HashMap.scala:468)
    at scala.collection.immutable.HashMap$HashTrieMap.foreach(HashMap.scala:468)
    at com.amazonaws.services.glue.connections.DynamoConnection.<init>(DynamoConnection.scala:49)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.amazonaws.services.glue.util.ClassUtils$.newInstanceByName(ClassUtils.scala:59)
    at com.amazonaws.services.glue.connections.Connection$.apply(Connection.scala:31)
    at com.amazonaws.services.glue.GlueContext.getSourceInternal(GlueContext.scala:887)
    at com.amazonaws.services.glue.GlueContext.getSource(GlueContext.scala:749)
    at com.amazonaws.services.glue.GlueContext.getCatalogSource(GlueContext.scala:396)
    at com.amazonaws.services.glue.GlueContext.getCatalogSource(GlueContext.scala:183)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
    at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
    at py4j.Gateway.invoke(Gateway.java:282)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.GatewayConnection.run(GatewayConnection.java:238)
    at java.lang.Thread.run(Thread.java:748)
 

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

1. Вероятно, он пытается преобразовать столбец временных меток в строковый столбец в фоновом режиме, чтобы использовать его для функции закладок. Но почему вы используете эту опцию? Если вы включите закладку в консоли для задания, вам не понадобятся эти дополнительные параметры.

2. Если я включу закладку в консоли для задания… это не сработает. У меня есть 2 исходные таблицы dynamodb. Один с 50 рядами, а другой с 35. Когда я включаю закладку в консоли и запускаю, каждый раз, когда она запускается, я возвращаю весь набор обратно. Таким образом, моя таблица с 50 строками превращается в 100 и так далее.

3. Я думаю, что закладки (только для консоли? или сценарий тоже) не работают с таблицами DynamoDB, а только с S3 или JDBC

4. Вы правы, они, похоже, не работают на Динамо. Одним из возможных вариантов было бы использование трубопровода, состоящего из потоков DynamoDB -> Лямбда ->> Пожарный шланг Kinesis.