这似乎很容易,就像这是这套功能的核心用例一样,但这是一个又一个问题。
最新的方法是尝试通过Glue Dev端点(PySpark和Scala端点)运行命令。
按照此处的说明进行操作:https://docs.aws.amazon.com/glue/latest/dg/dev-endpoint-tutorial-repl.html
import sys
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.transforms import *
glueContext = GlueContext(SparkContext.getOrCreate())
df = glueContext.create_dynamic_frame.from_catalog(database="mydb", table_name="mytable")
产生此错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/mnt/tmp/spark-0ba544c9-0b5a-42bb-8a54-9b3138205179/userFiles-95708c09-59f6-4b6d-9016-d0375d511b7a/PyGlue.zip/awsglue/dynamicframe.py", line 557, in from_catalog
File "/mnt/tmp/spark-0ba544c9-0b5a-42bb-8a54-9b3138205179/userFiles-95708c09-59f6-4b6d-9016-d0375d511b7a/PyGlue.zip/awsglue/context.py", line 136, in create_dynamic_frame_from_catalog
File "/mnt/tmp/spark-0ba544c9-0b5a-42bb-8a54-9b3138205179/userFiles-95708c09-59f6-4b6d-9016-d0375d511b7a/PyGlue.zip/awsglue/data_source.py", line 36, in getFrame
File "/usr/lib/spark/python/lib/py4j-0.10.4-src.zip/py4j/java_gateway.py", line 1133, in __call__
File "/usr/lib/spark/python/pyspark/sql/utils.py", line 69, in deco
raise AnalysisException(s.split(': ', 1)[1], stackTrace)
pyspark.sql.utils.AnalysisException: u'Unable to infer schema for Parquet. It must be specified manually.;'
它还会在设置行之一中生成此警告:
18/06/26 19:09:35 WARN Client: Neither spark.yarn.jars nor spark.yarn.archive is set, falling back to uploading libraries under SPARK_HOME.
整个设置非常简单:我们有一个传入的Kinesis数据流,一个用于生成JSON Kinesis数据流的处理器,一个配置为将该JSON流写入S3中的Parquet文件的Kinesis firehose流,然后所需的Glue目录配置即可实现。
雅典娜可以很好地看到数据,但是Scala / PySpark脚本出错了。
有什么想法/建议吗?
答案 0 :(得分:2)
好吧,仍然不清楚为什么会发生这种情况,但是找到了解决方法!
基本上,而不是使用生成的代码:
val datasource0 = glueContext.getCatalogSource(
database = "db",
tableName = "myTable",
redshiftTmpDir = "",
transformationContext = "datasource0"
).getDynamicFrame()
使用此代码:
val crawledData = glueContext.getSourceWithFormat(
connectionType = "s3",
options = JsonOptions(s"""{"path": "s3://mybucket/mytable/*/*/*/*/"}"""),
format = "parquet",
transformationContext = "source"
).getDynamicFrame()
这里的关键点似乎是*/*/*/*/
-如果我仅指定根文件夹,则会收到Parquet错误,并且(显然)普通的/**/*
通配符将不起作用。 / p>