Запрос S3 параллельно с SQL и разбиением - PullRequest
0 голосов
/ 31 октября 2018

Можно ли сделать простейшие параллельные запросы SQL для файла S3 с разбиением на части?

Проблема выглядит так, как будто вы должны выбрать 2 варианта из 3.

Вы можете выполнять параллельные SQL-запросы к S3 с помощью S3 Select. Но S3 Select не поддерживает разбиение, он также работает с одним файлом за раз.

Athena поддерживает разделение и запросы SQL, но имеет ограничение в 20 одновременных запросов. Лимит может быть увеличен, но нет гарантий и восходящей линии.

Вы можете настроить HBase, который работает на S3 через EMRFS, но для этого требуется много конфигураций. И я полагаю, что данные должны быть записаны через HBase (другой формат). Может быть, более простое решение?

1 Ответ

0 голосов
/ 31 октября 2018

Вы также можете использовать такие управляемые сервисы, как AWS Glue или AWS EMR.

Пример кода, который вы можете запустить в Glue:

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'])

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

def load_dict(_database,_table_name):
    ds = glueContext.create_dynamic_frame.from_catalog(database = _database, table_name = _table_name, transformation_ctx = "ds_table")
    df = ds.toDF()
    df.createOrReplaceTempView(_table_name)   
    return df

df_tab1=load_dict("exampledb","tab1")
df_sql=spark.sql( "select m.col1, m.col2 from tab1 m")
df_sql.write.mode('overwrite').options(header=True, delimiter = '|').format('csv').save("s3://com.example.data/tab2")

job.commit()

Вы также можете использовать Amazon Redshift Spectrum.

https://aws.amazon.com/blogs/big-data/amazon-redshift-spectrum-extends-data-warehousing-out-to-exabytes-no-loading-required/

...