Я хочу обработать большой файл, содержащий объект json в каждой строке, используя jq - PullRequest
1 голос
/ 11 июля 2019

Я хочу собрать json, присутствующий в каждой строке файла, на основе даты и учетной записи. Может быть несколько записей с одинаковой датой и учетной записью, мы должны объединить количество на основе даты и account_no.

пример файла:

{"date":"2019-04-01","count":0,"account_no":"1591"}
{"date":"2019-04-01","count":1,"account_no":"1592"}

Пожалуйста, предложите какое-нибудь решение. Количество jsons в файле почти 2.5cr

1 Ответ

1 голос
/ 11 июля 2019

JQ, используя inputs - это хороший путь.

Во-первых, вот общая ориентированная на поток функция sigma_by:

# In this formulation, f must either always evaluate to a string or
# always to an integer, it being understood that negative integers
# might be problematic
def sigma_by(s; f; g):
  reduce s as $x  (null; .[$x|f] += ($x|g));

Тогда решение может быть достигнуто путем:

sigma_by(inputs; "\(.date):\(.account_no)"; .count)

при условии использования параметра командной строки -n.

выход

При вводе сэмпла результат будет:

{
  "2019-04-01:1591": 0,
  "2019-04-01:1592": 1
}

Изменения

Само собой разумеется, есть много возможных вариантов. В частности, может быть оправдан вариант sigma_by, в котором используется словарь словарей, например, чтобы сэкономить место и избежать возможных проблем с синтаксическим анализом для восстановления двух строк «агрегировать по»:

def sigma_by(s; a; b; g):
  reduce s as $x  (null; .[$x|a][$x|b] += ($x|g));

sigma_by(inputs; .date; .account_no; .count)

Обратите внимание, что встроенный в jq "group_by" имеет существенный потенциальный недостаток для больших массивов: он использует алгоритм сортировки.

...