Какую очередь задач следует использовать при использовании RabbitMQ в JAVA?
Итак, я переводил свою кодовую базу с Django на Spring Boot Java. Но перед этим я пытался найти аналогичный фреймворк и библиотеку для каждой функции, которую я реализовал в Django. Одна из вещей, на которой я застрял, это очереди сообщений, В Django я использовал Rabbit MQ как очередь сообщений и Celery как очередь задач для обработки содержимого очереди.
Очередь задач и очередь сообщений. RabbitMQ является "MQ". Он принимает сообщения и отправляет сообщения.
Celery - это очередь задач. Она получает задания с соответствующими данными, выполняет их и доставляет результаты.
В Java я могу использовать RabbitMQ в качестве очереди сообщений, но какой пакет мне нужен для порождения рабочих? Обработки очереди? Что я должен использовать в качестве очереди задач? Как именно это работает в Java?
Вот возможное решение:
from pandas import json_normalize
df = json_normalize(
dict_,
record_path=['nested_dicts'],
meta = ['key1', 'key2', 'key3', 'key4', 'key5']
)
df = df.set_index(['key1', 'key2', 'key3', 'key4', 'key5'])
Здесь я использую функцию json_normalize
для сглаживания словаря, а затем устанавливаю индекс в key1
-key5
.
Вот pandas
единственное решение:
import pandas as pd
# Convert dict to dataframe
# https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.from_dict.html
df = pd.DataFrame.from_dict(dict_)
# Explode the nested_dicts column: each item/dict in list is transformed into a new row in the dataframe
# https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.explode.html
df2 = df.explode('nested_dicts', ignore_index=True)
# Assign the nested_dicts dictionaries to a new column for each key
# while dropping the nested_dicts column from the dataframe
# https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.assign.html
df3 = df2.drop('nested_dicts', 1).assign(**pd.DataFrame(df2.nested_dicts.values.tolist()))
# Set index
df4 = df3.set_index(df3.columns.tolist())
df4
Основано на ответах Юрия с небольшим автоматическим распознаванием для meta
и record_path
.
# take the first item to detect meta, record_path
meta, record_path = [], []
for key_j, value_j in dict_[0].items():
if not isinstance(value_j, list):
meta.append(key_j)
else:
record_path.append(key_j)
# adopted Yury's solution
df = pandas.json_normalize(
dict_,
record_path=record_path[:1],
meta = meta,
)
df.set_index(meta, inplace=True)
Возможно, я неправильно понял проблему, но зачем нужны большие громоздкие библиотеки для этого, если 33 строки кода на python могут сделать все это?
выдает следующий результат:
original data:
[{'key1': 'value1',
'key2': 'value2',
'nested_dicts': [{'nested_key1': 'nested_value_1',
'nested_key2': 'nested_value_2'},
{'nested_key1': 'nested_value_3',
'nested_key2': 'nested_value_4'}],
'some_list_to_keep': ['list_value_1', 'list_value_2'],
'some_value_to_keep': 'kept_value1'},
{'key1': 'value1',
'key2': 'value2',
'nested_dicts': [{'nested_key1': 'nested_value_5',
'nested_key2': 'nested_value_6'},
{'nested_key1': 'nested_value_7',
'nested_key2': 'nested_value_8'}],
'some_list_to_keep': ['list_value_3', 'list_value_4'],
'some_other_list_to_keep': ['list_value_5', 'list_value_6'],
'some_value_to_keep': 'kept_value2'},
{'key1': 'value3',
'key2': 'value4',
'nested_dicts': [{'nested_key1': 'nested_value_9',
'nested_key2': 'nested_value_10'},
{'nested_key1': 'nested_value_11',
'nested_key2': 'nested_value_12'}],
'some_other_value_to_keep': 'kept_value3',
'yet_another_list_to_keep': ['list_value_7', 'list_value_8']}]
flattened and merged data
[{'key1': 'value1',
'key2': 'value2',
'nested_key1': ['nested_value_1',
'nested_value_3',
'nested_value_5',
'nested_value_7'],
'nested_key2': ['nested_value_2',
'nested_value_4',
'nested_value_6',
'nested_value_8'],
'some_list_to_keep': [['list_value_1', 'list_value_2'],
['list_value_3', 'list_value_4']],
'some_other_list_to_keep': [['list_value_5', 'list_value_6']],
'some_value_to_keep': ['kept_value1', 'kept_value2']},
{'key1': 'value3',
'key2': 'value4',
'nested_key1': ['nested_value_9', 'nested_value_11'],
'nested_key2': ['nested_value_10', 'nested_value_12'],
'some_other_value_to_keep': ['kept_value3'],
'yet_another_list_to_keep': [['list_value_7', 'list_value_8']]}]