elasticsearch 从字典收集数据

jaxagkaj  于 2022-11-22  发布在  ElasticSearch
关注(0)|答案(1)|浏览(180)

我有一个字典,它有许多不同的会话,在不同的日期开始和结束。每个会话桶有多个结果,每个结果有一个时间戳。
每一个结果都可以是错误的或者不是的。
我希望收集所有会话的数据以回答以下问题:在会话结束或开始时更经常发生错误。
这是那本字典的一小部分

"aggregations": {
        "Sessioncount": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
                {
                    "key": "1dec8193-1bf8-4ba1-ade0-332a53ca01e8",
                    "doc_count": 116,
                    "SessionTimestamps": {
                        "doc_count_error_upper_bound": 0,
                        "sum_other_doc_count": 0,
                        "buckets": [
                            {
                                "key": [
                                    "None",
                                    "2022-11-09T12:29:18.489Z"
                                ],
                                "key_as_string": "None|2022-11-09T12:29:18.489Z",
                                "doc_count": 1
                            },
                            {
                                "key": [
                                    "None",
                                    "2022-11-09T12:29:18.618Z"
                                ],
                                "key_as_string": "None|2022-11-09T12:29:18.618Z",
                                "doc_count": 1

这个会话有很多条目,我们在这里看到的两个没有返回错误代码。还有大约50个会话。
任何提示或帮助是受欢迎的。
我的主要问题是,我真的想不出一种通过dict循环并为每个会话获取数据的方法。
我正在使用Python
我可以直接到第一个“桶”,但不能再进一步。

df = pd.json_normalize(resp["aggregations"]
                           ["Sessioncount"]["buckets"])

如果我试着这样更进一步:

df = pd.json_normalize(resp["aggregations"]
                           ["Sessioncount"]["buckets"]["SessionTimestamps"])

出现错误:列表索引必须是整数或切片,而不是字符串
您如何回答以下问题:错误主要出现在会话的前半部分还是每个会话的后半部分?

jgwigjjp

jgwigjjp1#

对象“聚合”中的目标“存储桶”不是字典,而是列表

您问题的正确答案

buckets = resp["aggregations"]["Sessioncount"]["buckets"][0]
sessionTimestamps = buckets["SessionTimestamps"]

df = pd.json_normalize(sessionTimestamps)
为什么会出现此问题?

"aggregations": {}是字典,"Sessioncount": {}也是字典。您可以使用.get('child')函数或传统的['child']选择器来浏览这些字典:
例如:

dictionary = { "child_1": 0, "child_2": 1 }
print(dictionary.get('child_1'), dictionary['child_2'])

=============== RESTART: main.py ===============
0 1

在字典中导航时,您偶然发现了"buckets": [{}],它是一个列表,其中包含字典数据作为子项。
下面是一个列表迭代的示例:

list = [ "a", "b", "c" ]
print(list[0], list[1], list[2])

=============== RESTART: main.py ===============
a b c

我们想访问字典"SessionTimestamps": {},它位于"buckets": [{ "SessionTimestamps": {} }]list的第一个字典中,问题是你必须使用“indices”来访问list的子字典。
因此,错误为"TypeError: list indices must be integers or slices, not str"
要了解更多信息,您可以访问geeksforgeeks,获得有关difference between List and Dictionary in Python的简洁教程
我希望这对你有帮助:)

相关问题