如何从cosmos数据库集合中获取列信息



我正在为cosmos数据库使用spark连接器,但我只想从集合中获得列信息,如下例所示。

收藏:

[
{
"AMT_INCOME_TOTAL": 135000,
"NAME_FAMILY_STATUS": null,
"FLAG_OWN_REALTY": null,
"NAME_HOUSING_TYPE": null,
"DAYS_BIRTH": -18981,
"NAME_EDUCATION_TYPE": null,
"CNT_CHILDREN": 0,
"NAME_CONTRACT_TYPE": null,
"FLAG_CONT_MOBILE": 1,
"FLAG_WORK_PHONE": 0,
"SK_ID_CURR": 421505,
"FLAG_MOBIL": 1,
"id": "5b422022-4fd9-41b6-9634-46fb9066c600",
"AMT_GOODS_PRICE": 697500,
"NAME_INCOME_TYPE": null,
"ORGANIZATION_TYPE": null,
"FLAG_OWN_CAR": null,
"FLAG_PHONE": 0,
"AMT_ANNUITY": 33777,
"CNT_FAM_MEMBERS": null,
"OWN_CAR_AGE": null,
"AMT_CREDIT": 794173.5,
"OCCUPATION_TYPE": null,
"DAYS_REGISTRATION": -10906,
"DAYS_ID_PUBLISH": -2522,
"DAYS_EMPLOYED": -989,
"FLAG_EMP_PHONE": 1,
"CODE_GENDER": null,
"NAME_TYPE_SUITE": null,
"_rid": "oQg3AJL4IrkBAAAAAAAAAA==",
"_self": "dbs/oQg3AA==/colls/oQg3AJL4Irk=/docs/oQg3AJL4IrkBAAAAAAAAAA==/",
"_etag": ""6f01a675-0000-1900-0000-5f8409f30000"",
"_attachments": "attachments/",
"_ts": 1602488819
},
{
"EMPLOYEE_ID": 101,
"EMPLOYEE_NAME": "Dom",
"id": "b44dc898-cb85-4db6-9f3d-8dda1f57fdca",
"EMPLOYEE_ADD": "Florida",
"FILE_NAME": "XLSX_Files/Employee_Data.xlsx",
"EMPLOYEE_CONTACTNO": 9851,
"_rid": "oQg3AJL4IrmldgQAAAAAAA==",
"_self": "dbs/oQg3AA==/colls/oQg3AJL4Irk=/docs/oQg3AJL4IrmldgQAAAAAAA==/",
"_etag": ""00000481-0000-1900-0000-5fbcef090000"",
"_attachments": "attachments/",
"_ts": 1606217481
}
]

预期输出:

AMT_INCOME_TOTAL
NAME_FAMILY_STATUS
FLAG_OWN_REALTY 
NAME_HOUSING_TYPE 
DAYS_BIRTH
NAME_EDUCATION_TYPE 
CNT_CHILDREN
NAME_CONTRACT_TYPE 
FLAG_CONT_MOBILE
FLAG_WORK_PHONE
SK_ID_CURR
FLAG_MOBIL
id 
AMT_GOODS_PRICE
NAME_INCOME_TYPE 
ORGANIZATION_TYPE 
FLAG_OWN_CAR 
FLAG_PHONE
AMT_ANNUITY
CNT_FAM_MEMBERS 
OWN_CAR_AGE 
AMT_CREDIT
OCCUPATION_TYPE 
DAYS_REGISTRATION
DAYS_ID_PUBLISH
DAYS_EMPLOYED
FLAG_EMP_PHONE
CODE_GENDER 
NAME_TYPE_SUITE 
EMPLOYEE_ID
EMPLOYEE_NAME
EMPLOYEE_ADD
FILE_NAME
EMPLOYEE_CONTACTNO

不,没有简单的方法可以做到这一点

为什么

CosmosDB是无方案的,设计用于无限水平规模。每个分区上的每个文档都可以包含任何内容,据我所知,并没有API可以查询有关文档树的任何元数据库。文档甚至不必在每个节点上都建立索引,因此您所要求的内容不符合无计划无休止存储的要求。

你能做什么

你可以做到这一点,但这会增加复杂性,需要一些修补。

阅读所有文档

要想知道运行时所有文档的聚合,必须读取所有文档并将结果简化为唯一的树结构。这不会扩大规模,很可能太荒谬了,甚至无法尝试。

通过触发器自己创建索引文档

由于CosmosDB没有为您提供合适的索引数据,您可以自己管理此索引。基本上,您可以设置一个特殊的文档(即partitionKey=null, id="myMagicColumnMap"(,并在每次创建/更新/删除时使用使用的属性名称升级该文档。

您可以阅读有关如何编写CosmosDB触发器的信息。

请注意,这意味着每个CosmosDB写入操作都要做一些工作,并且需要考虑成本、并发性、错误处理和其他此类问题。

在CosmosDB之外创建索引文档

最好在CosmosDB集合之外实现索引文档的更新(即使您将其存储在CosmosDB中(。通过这种方式,您仍然可以利用完整的cosmosDB速度,并且可以更好地隔离自定义索引的影响。

最简单的方法是让您的客户端应用程序通过某个层传递您的请求,如果发现任何新列,则将它们持久化到您的索引中。

或者,您也可以利用CosmosDB更改提要作为单独的客户端,通过处理添加/更改的文档批次来查找添加的列。这样,您的索引也独立于实际处理数据的客户端。(不过,如果我没记错的话,change feed目前没有执行删除操作,你必须单独管理这些操作(。

最新更新