3

J'ai un fichier json sur S3, je veux le transférer vers Redshift. Un hic est que le fichier contient des entrées dans un tel format:Aplatissement du fichier JSON lors du transfert de S3 vers RedShift à l'aide d'AWS Pipeline

{ 
    "user_id":1, 
    "metadata": 
      { 
       "connection_type":"WIFI", 
       "device_id":"1234" 
      } 
} 

Avant que je vais l'enregistrer sur Redshift Je veux aplatir le fichier à contenir des colonnes:

user_id | connection_type | device_id 

Comment puis-je faire cela en utilisant AWS Data Pipeline? Y at-il une activité qui peut transformer json à la forme souhaitée? Je ne pense pas que transformer sql supportera les champs json.

Répondre

3

Vous n'avez pas besoin de l'aplatir. Vous pouvez le charger avec la commande copy après avoir défini un fichier de configuration jsonpaths pour extraire facilement les valeurs de colonnes de chaque objet json.

Avec votre structure que vous souhaitez créer un fichier dans S3 (s3://bucket/your_jsonpaths.json) comme ceci:

{ 
    "jsonpaths": [ 
     "$.user_id", 
     "$.metadata.connection_type", 
     "$.metadata.device_id" 
    ] 
} 

Ensuite, vous courrais quelque chose comme ça dans Redshift:

copy your_table 
from 's3://bucket/data_objects.json' 
credentials '<aws-auth-args>' 
json 's3://bucket/your_jsonpaths.json'; 

Si vous avez des problèmes voir ce qui se trouve dans le tableau stv_load_errors.

Consultez le Redshift copy command et examples.

+0

Serait-il possible d'automatiser la commande COPY pour chaque fichier placé dans un compartiment S3? Est-ce que la COPIE peut être déclenchée via le SDK? Si c'est le cas, il devrait être possible d'écrire une fonction Lambda qui déclenche la commande. – AitorF

+1

Vous pouvez activer les notifications SNS sur votre compartiment S3 et déclencher le lambda à partir de celui-ci. Consultez ceci: http://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html et http://docs.aws.amazon.com/sns/latest/dg/sns-lambda.html – systemjack