当前位置: 首页 > 知识库问答 >
问题:

Azure Databricks Spark SQL Query to CosmosDB 從其他文档獲取列

车胤运
2023-03-14

使用 Azure-Cosmosdb-spark 连接器将 sql 查询传递到 CosmosDB 时,它似乎从集合中的其他文档添加列。集合中有许多文档,例如用户和公司,它们由实体类型分隔。例如,用户设置为

{   "id": "user-000003",
    "email": "someemail",
    "firstName": "firstname",
    "lastName": "lastname",
    "username": "someusername",
    "companyId": "company-000003",
    "entity": "user"
}

本公司成立为:

{   "id": "company-000003",
    "contactName": "namegoes here",
    "addressLine1": "Address line 1",
    "addressLine2": "Address line 2",
    "entity": "company"
}

使用Azure-Cosmosdb火花sdk我创建了我的连接

cosmosConfig = {
                "Endpoint" : "my endpoint goes here",
                "Masterkey" : "my key goes here",
                "Database" : "my database goes here",
                "preferredRegions" : "my region goes here",
                "Collection" : "my collection", 
                "SamplingRatio" : "1.0",
                "schema_samplesize" : "1000",
                "query_pagesize" : "2147483647",
               }

然后呢

将其设置为使用该连接

cosmosdbConnection = spark.read.format("com.microsoft.azure.cosmosdb.spark").options(**cosmosConfig).load()
cosmosdbConnection.createOrReplaceTempView("c")

然后,我运行查询

exampleQuery= 'SELECT c.* FROM c WHERE c.entity = "user"'
users = spark.sql(exampleQuery)

我希望得到一个包含用户文档中定义的列、id、email、firstName、lastName、username、companyId和实体的数据帧。但是,它也从公司文档中提取列名,但都是空值。在Azure Cosmos DB存储资源管理器或Azure门户中运行相同的查询,只会返回用户文档。

我只需要指定我想要的列名,但是如果模式发生变化,我需要添加这些列。

我想是这个问题吧?我正在寻找在sql查询中从文档中获取列的方法。我确实认为它会将sql查询传递给cosmosdb SQL API。

这是我第一次在cosmos数据库中使用数据库,我在谷歌上搜索过,但似乎看不到我做错了什么。

共有1个答案

董飞
2023-03-14

问题在于,在配置设置中,没有指定对集合的SQL查询,它只是读取集合中的所有文档,而不是应按实体/主题类型拆分的不同文档。

通过在配置中添加 SQL 查询

cosmosConfig = {
                "Endpoint" : "my endpoint goes here",
                "Masterkey" : "my key goes here",
                "Database" : "my database goes here",
                "preferredRegions" : "my region goes here",
                "Collection" : "my collection", 
                "SamplingRatio" : "1.0",
                "schema_samplesize" : "1000",
                "Query" : "SELECT * FROM c WHERE C.entity = 'SomeEntity"
                "query_pagesize" : "2147483647",
               }

它将在此基础上创建连接。如果您需要添加多个实体,请创建一个函数,例如:

def createCosmosDBObject(useEntity):
  query = "SELECT * FROM c WHERE c.entity = " + "'" + useEntity + "'"
  # Create connection setting
  cosmosConfig = {
                "Endpoint" : "Kyour endpoint",
                "Masterkey" : "Your Key",
                "Database" : "Your Database",
                "preferredRegions" : "Azure Region",
                "Collection" : "Your Collection", 
                "ConnectionMode": "DirectHttps", 
                "SamplingRatio" : "1.0",
                "schema_samplesize" : "20000",
                "query_pagesize" : "2147483647",
                "query_custom" : query
               }

  createConnection = spark.read.format("com.microsoft.azure.cosmosdb.spark").options(**cosmosConfig).load()
  createConnection.createOrReplaceTempView(useEntity)

然后可以通过文档实体名称调用它:

createCosmosDBObject("customer")

然后,它将在查询中插入“customer ”,然后创建一个可以查询的临时视图,而不会与Cosmos DB中的其他文档实体类型重叠

希望那有帮助

 类似资料:
  • 了解更多有关于Giojs 基本元素 阅读markdown格式的API文档 APIs 如果你有兴趣参与Giojs开发,不妨先从 开发指南 中熟悉一下Giojs的开发规范

  • 我用的是iTextSharp版。 对于我的项目,我需要使用pdfWriter将我的pdf文档复制到另一个pdf文档中。我不能使用pdfCopy或pdfStamper。 因此,在此操作期间,所有注释都会丢失。 首先,我开始寻找如何获得“铅笔注释绘图标记”的注释,如下图所示: 我找到了如何获取注释字典: 当循环解析我的注释时,annotName变量返回我的名字,所以我确定要解析我要查找的注释,但ann

  • 我想知道如何检索Firestore收藏中的所有其他文档。我有一个包含日期字段的文档集合。我想按日期对它们进行排序,然后从排序后的集合中的每个X大小的块中检索1个文档。我大约每10秒钟就添加一个新文档,并试图在前端显示历史数据,而不必下载这么多记录。

  • 下面的书籍包含有关80386的其他资料。 Introduction to the 80386, order number 231252 80386 Hardware Reference Manual, order number 231732 80386 System Software Writer's Guide, order number 231499 80386 High Performanc

  • 我如何通过我自己的API从另一个API获取PDF,然后到前面供用户下载。 我现在得到的只是一张空白页。 后面是Scala的,当我打印文件时,我得到一个字符串。