Estoy usando Kinesis firehose para transferir datos a Redshift a través de S3. Tengo un archivo csv muy simple que se ve así. Firehose lo pone en s3 pero Redshift falla con el error Delimitador no encontrado. He mirado literalmente todas las publicaciones relacionadas con este error, pero me aseguré de que el delimitador esté incluido.
Expediente
GOOG,2017-03-16T16:00:01Z,2017-03-17 06:23:56.986397,848.78 GOOG,2017-03-16T16:00:01Z,2017-03-17 06:24:02.061263,848.78 GOOG,2017-03-16T16:00:01Z,2017-03-17 06:24:07.143044,848.78 GOOG,2017-03-16T16:00:01Z,2017-03-17 06:24:12.217930,848.78O
"GOOG","2017-03-17T16:00:02Z","2017-03-18 05:48:59.993260","852.12" "GOOG","2017-03-17T16:00:02Z","2017-03-18 05:49:07.034945","852.12" "GOOG","2017-03-17T16:00:02Z","2017-03-18 05:49:12.306484","852.12" "GOOG","2017-03-17T16:00:02Z","2017-03-18 05:49:18.020833","852.12" "GOOG","2017-03-17T16:00:02Z","2017-03-18 05:49:24.203464","852.12"Tabla de corrimiento al rojo
CREATE TABLE stockvalue ( symbol VARCHAR(4), streamdate VARCHAR(20), writedate VARCHAR(26), stockprice VARCHAR(6) );errores errores
Por si acaso, así es como se ve mi flujo de kinesis Firehose
¿Puede alguien señalar qué puede estar mal con el archivo? Agregué una coma entre los campos. Todas las columnas en la tabla de destino son varchar, por lo que no debería haber ningún motivo para el error de tipo de datos. Además, las longitudes de las columnas coinciden exactamente entre el archivo y la tabla de corrimiento al rojo. He intentado incrustar columnas entre comillas dobles y sin ellas.
¿Puedes publicar el comando COPY completo? Está cortado en la captura de pantalla.
Supongo que le falta DELIMITER ',' en su comando COPY. Intente agregar eso al comando COPY.
Estuve atascado en esto durante horas y, gracias a la respuesta de Shahid, me ayudó a resolverlo.
Redshift siempre tratará las columnas de su tabla como minúsculas, por lo que al asignar claves JSON a columnas, asegúrese de que las claves JSON estén en minúsculas , por ejemplo
{'id': 'val1', 'name': 'val2'}{'id': 'val1', 'name': 'val2'}{'id': 'val1', 'name': 'val2'}{'id': 'val1', 'name': 'val2'} COPY latency(id,name) FROM 's3://<bucket-name>/<manifest>' CREDENTIALS 'aws_iam_role=arn:aws:iam::<aws-account-id>:role/<role-name>' MANIFEST json 'auto';Las configuraciones dentro de Firehose deben tener los nombres de columna especificados (nuevamente, en minúsculas). Además, agregue lo siguiente a las opciones de COPIA de Firehose:
json 'auto' TRUNCATECOLUMNS blanksasnull emptyasnullA continuación se muestra un fragmento que muestra cómo usar las funciones put_records con kinesis en python:
'objetos' pasados a la función 'put_to_stream' es una matriz de diccionarios:
def put_to_stream(objects): records = [] for metric in metrics: record = { 'Data': json.dumps(metric), 'PartitionKey': 'swat_report' }; records.append(record) print(records) put_response = kinesis_client.put_records(StreamName=kinesis_stream_name, Records=records) flush ``1- Debe agregar FORMAT AS JSON 's3://yourbucketname/aJsonPathFile.txt'. AWS no ha mencionado esto ya. Tenga en cuenta que esto solo funciona cuando sus datos están en formato JSON como
{'atributo1': 'val1', 'atributo2': 'val2'} {'atributo1': 'val1', 'atributo2': 'val2'} {'atributo1': 'val1', 'atributo2': 'val2' } {'atributo1': 'val1', 'atributo2': 'val2'}
2- También debe verificar el orden de las columnas en kinesis firehouse y en el archivo csv e intente agregar
TRUNCATECOLUNS en blanco como nulo vacío como nulo
3- Un ejemplo
COPY testrbl3 ( eventId,serverTime,pageName,action,ip,userAgent,ubicación,plateform,language,campaña,content,source,medium,productID,colorCode,scrolltoppercentage) FROM 's3://bucketname/' CREDENCIALES 'aws_iam_role=arn: aws:iam:::role/' MANIFEST json 'auto' TRUNCATECOLUMNS en blanco como nulo vacío como nulo;