Hadoop и Cassandra для сравнения 2 строк
У меня есть две строки в Cassandra ColumnFamily, и я хочу сравнить значения столбцов с одним и тем же именем столбца, например:
CF: пользователь
Ключ: столбцы:
......................................................
K1: {Col1: "Энди" V1: "100"} {Col2: "Том" V2: "100"}
K2: {Col1: "Энди" V1: "120"} {Col2: "Том" V2: "90"}
Теперь я хочу сравнить разницу столбцов K2 с столбцами K1, чтобы получить этот результат в Кассандре:
Ключ: столбцы:
.........................................................................
K1: {Col1: "Энди" V1: "100"} {Col2: "Том" V2: "100"}
K2: {Col1: "Andy" V1: "120" Diff: 20} {Col2: "Tom" V2: "90" Diff: -10}
Сначала я хочу кодировать это с помощью Hadoop, но я вижу проблему, которая не может определить два ключа для процесса карты?
Haddop был выбором, потому что это должно быть масштабируемое решение.
Я надеюсь, у кого-нибудь есть подсказка для?
БГ, Дэнни
1 ответ
Я не понимаю, какой строкой будет представлена база вычитания? K1[V1]-K2[V1] или наоборот?
Хорошо, допустим, что строка с недавней отметкой времени будет основой.
Ваш шаг Map должен выдать следующее (K => V):
// each value is a WritableComparable object to allow sorting by timestamp
"Andy" => {"key":K1, "value":100, timestamp1}
"Tom" => {"key":K1, "value":100, timestamp2}
"Andy" => {"key":K2, "value":120, timestamp3}
"Tom" => {"key":K2, "value":90, timestamp4}
Шаг уменьшения получит массив пар, для каждого значения отсортированы по отметке времени:
"Andy" => [ {"key":K1, "value":100, timestamp1},
{"key":K2, "value":120, timestamp3} ]
"Tom" => [ {"key":K1, "value":100, timestamp2},
{"key":K2, "value":90, timestamp4} ]
Теперь в шаге сокращения вы можете легко выполнить вычитание и записать необходимые столбцы, такие как "diff" в базу данных.