AWS CLI DynamoDB Как передать переменную в get-item --key map - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь перебрать список идентификаторов пользователей для извлечения записей из таблицы DynamoDB с помощью интерфейса командной строки AWS.

// list.txt

abcdefghijklmnop1234567890123456
bbcdefghijklmnop1234567890123456
cbcdefghijklmnop1234567890123456
dbcdefghijklmnop1234567890123456
ebcdefghijklmnop1234567890123456

Я выполнил команду get-item aws, чтобы извлечь одну запись:


$ aws dynamodb get-item --table-name "fake-table" --key '{"userId": {"S": "abcdefghijklmnop1234567890123456"}}'

Это дало мне то, что я хотел:

{
    "Item": {

        ...

        "userId": {
            "S": "abcdefghijklmnop1234567890123456"
        },

        "data": { ... }
    }
}

Я сейчас пытаюсь перебрать list.txt, чтобы передать каждый идентификатор как переменную в опцию --key, которую я понимаюбыть картой и в форме json.

https://docs.aws.amazon.com/cli/latest/reference/dynamodb/get-item.html

Мой скрипт выглядит следующим образом:

while read LINE
do
    echo "$LINE"
    (aws dynamodb get-item --table-name "fake-table" --key '{"userId": {"S": $LINE}}') >> output.txt
done < list.txt

Вышла эта ошибка:

Error parsing parameter '--key': Invalid JSON: Expecting value: line 1 column 22 (char 21)
JSON received: {"userId": {"S": $$LINE}}
abcdefghijklmnop1234567890123456

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

  1. Как передать переменную в карту?

Я также хотел бы расширить поиск, чтобы возвращать записи только для пользовательских идентификаторов, которые содержат данные.

Как мне расширить поиск get-item, чтобы проверить, что данные не равны {}?

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

Я также собираюсь сделать это в node.js.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019
  1. Оказалось, что одинарные кавычки, как указал @MilanCermak.

  2. Целью цикла было получение соответствующих пользовательских записей из списка.(всего 12 000), но запросы к базе данных каждый раз были слишком трудоемкими.Было быстрее извлечь все (550 000) записей DynamoDB и манипулировать ими с помощью скрипта Python.

aws dynamodb scan --table-name "fake-table" \
  --projection-expression "userId" \
  --max-items 550000 --page-size 90 --region xx-xxx-1 \
  | python reformat_list.py > results.csv

Мне понравилась эта проблема 0_0

0 голосов
/ 15 февраля 2019

Одиночные кавычки не позволяют вашей оболочке (я предполагаю, что bash или подобный) раскрывают переменную $LINE.Вместо этого они сохраняют его как буквальное значение.См. Раздел «Цитирование» в руководстве по bash .

Попробуйте заключить все в двойные кавычки, избегая слэша, который вам необходим для форматирования значения JSON:

aws dynamodb get-item --table-name "fake-table" --key "{\"userId\": {\"S\": $LINE}}" >> output.txt
...