Использование AWS Athena для запроса одной строки из CSV-файла в s3 для запроса и экспорта списка - PullRequest
0 голосов
/ 21 декабря 2018

Мне нужно выбрать только одну строку, последнюю строку из многих многострочных CSV-файлов и добавить их в таблицу в aws athena, а затем экспортировать их в CSV-файл как весь список.

Я пытаюсь собрать данные из многих источников, и файлы CSV обновляются еженедельно, но мне нужна только одна строка из каждого файла.Я использовал стандартный импорт в Афину, и он импортирует все строки из выбранных CSV в корзине, но мне нужна только последняя строка каждой, так что у меня есть самые последние данные из этого файла.

CREATE EXTERNAL TABLE IF NOT EXISTS inventory.laptops (
  `date` string,
  `serialnum` string,
  `biosver` string,
  `machine` string,
  `manufacturer` string,
  `model` string,
  `win` string,
  `winver` string,
  `driveletter` string,
  `size` string,
  `macaddr` string,
  `domain` string,
  `ram` string,
  `processor` string,
  `users` string,
  `fullname` string,
  `location` string,
  `lastconnected` string 
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
  'serialization.format' = ',',
  'quoteChar' = '"',
  'field.delim' = ','
) LOCATION 's3://my-s3-bucket/'
TBLPROPERTIES ('has_encrypted_data'='false',"skip.header.line.count"="1");

Мне нужна последняя строка из каждого файла CSV в s3, но я получаю каждую строку, используя этот запрос создания

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Так что это невозможно, но вы можете создать лямбда-функцию для конкатенации последней строки нескольких CSV-файлов в каталоге Bucket и печати в один CSV, а затем импортировать его в Афину для запросов.Я использовал Python, чтобы решить эту проблему.

import logging
import boto3 ,os
import json

logger = logging.getLogger()
logger.setLevel(logging.INFO)

s3 = boto3.client('s3')

def lambda_handler(event, context):
data = ''

# retrieve bucket name and file_key from the S3 event
bucket_name = os.environ['s3_bucket']
# get the object
obj_list = s3.list_objects_v2(Bucket = bucket_name, Prefix = 'bucket prefix')
x = 0
for object in obj_list['Contents']:
    obj = s3.get_object(Bucket=bucket_name, Key=object['Key'])
    # get lines inside the csv
    lines = obj['Body'].read().split(b'\n')
    f = 0
    for r in lines:
       f += 1
       #Reads the number of lines in the file
    b = 0
    for r in lines:
        if x < 1:
            x +=1
            if b == 0:
                header = (r.decode())
                data +=(header)
        b += 1
        if b == f-1:
            data += (r.decode())
s3.put_object(Bucket=bucket_name, Key='Concat.csv', Body=data)
0 голосов
/ 22 декабря 2018

Да, CREATE TABLE определяет, как читать файл.Вам нужно будет создать оператор SELECT, чтобы получить нужную строку.Вам потребуется использовать некоторый идентификатор в файле, который может указывать на последнюю строку, например, иметь самую последнюю дату.

Например, если последняя строка всегда имеет самую последнюю date, вы можете использовать:

SELECT *
FROM inventory.laptops
ORDER BY date
LIMIT 1

Если нет поля, которое можно было бы использовать для идентификации последней строки, вам может потребоваться использовать чит, чтобы узнать количество строк в файле, а затем пропустить все строки, кроме последней, с помощью skip.header.line.count.

Обычно порядок строк в файле не имеет значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...