Преобразуйте json в AWS-GLUE и загрузите в Amazon Redshift - PullRequest
0 голосов
/ 24 мая 2018

Я прочитал эту статью об амазоне о выравнивании файла json и загрузке в красное смещение.

https://aws.amazon.com/blogs/big-data/simplify-querying-nested-json-with-the-aws-glue-relationalize-transform/

Я планирую преобразовать файл json и загрузить его в s3, а затем сканироватьснова поместите файл в aws-клей для каталога данных и загрузите данные в виде таблиц в amazon redshift.

Теперь проблема с кодом в «Образце 3: код Python для преобразования вложенного JSON и вывода его вORC 'показывает некоторые ошибки:

NameError: имя' spark 'не определено

Я не потерян, потому что я новичок в aws-glue и мне нужно загрузить json (они вложенныемассивы) в красном смещении.

Вот мой код:

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 awsglue.transforms import Relationalize



# Begin variables to customize with your information
glue_source_database = "DATABASE"
glue_source_table = "TABLE_NAME"
glue_temp_storage = "s3://XXXXX"
glue_relationalize_output_s3_path = "s3://XXXXX"
dfc_root_table_name = "root" #default value is "roottable"
# End variables to customize with your information

glueContext = GlueContext(spark.sparkContext)
datasource0 = glueContext.create_dynamic_frame.from_catalog(database = glue_source_database, table_name = glue_source_table, transformation_ctx = "datasource0")
dfc = Relationalize.apply(frame = datasource0, staging_path = glue_temp_storage, name = dfc_root_table_name, transformation_ctx = "dfc")
blogdata = dfc.select(dfc_root_table_name)
blogdataoutput = glueContext.write_dynamic_frame.from_options(frame = blogdata, connection_type = "s3", connection_options = {"path": glue_relationalize_output_s3_path}, format = "orc", transformation_ctx = "blogdataoutput")

Ответы [ 2 ]

0 голосов
/ 26 июля 2018

@ beni

У меня была такая же проблема, как и у вас, из-за корректного контекста искры возникает другая проблема с написанием glueContext.write_dynamic_frame.from_options .

Проверяя журнал, я увидел ошибка нулевого значения .Таким образом, добавление DropNullFields.apply решило проблему

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

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

# Begin variables to customize with your information
glue_source_database = "database_name"
glue_source_table = "table_name"
glue_temp_storage = "s3://bucket/tmp"
glue_relationalize_output_s3_path = "s3://bucket/output"
dfc_root_table_name = "root"  # default value is "roottable"
# End variables to customize with your information

sc = SparkContext()
glueContext = GlueContext(sc)
spark = GlueContext(sc).spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)

datasource0 = glueContext.create_dynamic_frame.from_catalog(database=glue_source_database, table_name=glue_source_table,
                                                            transformation_ctx="datasource0")
dfc = Relationalize.apply(frame=datasource0, staging_path=glue_temp_storage, name=dfc_root_table_name,
                          transformation_ctx="dfc")
fb_data = dfc.select(dfc_root_table_name)
dropnullfields3 = DropNullFields.apply(frame=fb_data, transformation_ctx="dropnullfields3")
fb_dataoutput = glueContext.write_dynamic_frame.from_options(frame=dropnullfields3, connection_type="s3",
                                                             connection_options={
                                                                 "path": glue_relationalize_output_s3_path},
                                                             format="orc", transformation_ctx="fb_dataoutput")

job.commit()

Надеюсь, эта помощь!

0 голосов
/ 24 мая 2018

Вы ошибочно создаете GlueContext.Ваш код должен выглядеть так:

from pyspark.context import SparkContext

glueContext = GlueContext(SparkContext.getOrCreate())

Вы можете взглянуть на Примеры кодов клея из AWS .

...