Scala: неправильный порядок элементов при сохранении данных в CosmosDB в Databricks - PullRequest
0 голосов
/ 02 января 2019

Я использую коннектор Apache Spark для Azure Cosmos DB для хранения фрейма данных в scala на CosmosDB.Это работает, но есть странная вещь с порядком элементов в документе, который хранится.

import org.apache.spark.sql.types._

val schema = new StructType()
.add("a", StringType, true)   
.add("b", StringType, true) 
.add("c",                 
    new StructType()
      .add("d", StringType, true)
      .add("e", StringType, true)
      .add("f", StringType, true)
)

val dataDS = Seq("""
{
"a": "a",
"b": "b",
"c": {
    "d": "d",
    "e": "e",
    "f": "f"
}
}""").toDS()

val df = spark.read.schema(schema).json(dataDS)                    
println(df.printSchema())
df.write.mode(SaveMode.Overwrite).cosmosDB(writeConfig)

создает этот документ в CosmosDB

{
"a": "a",
"b": "b",
"c": {
    "d": "d",
    "e": "e",
    "f": "f"
},
"id": "7c2ef8b9-86a6-4aa3-b190-d5083c885ea8",
"_rid": .....
}

, в то время как этот код

import org.apache.spark.sql.types._

val schema = new StructType()
.add("a", StringType, true)   
.add("beta", StringType, true)          <<-----
.add("c",                 
    new StructType()
      .add("d", StringType, true)
      .add("echo", StringType, true) .  <<-----
      .add("f", StringType, true)
)

val dataDS = Seq("""
{
"a": "a",
"beta": "b",                            <<-----
"c": {
    "d": "d",
    "echo": "e",                        <<-----
    "f": "f"
}
}""").toDS()

val df = spark.read.schema(schema).json(dataDS)                    
println(df.printSchema())
df.write.mode(SaveMode.Overwrite).cosmosDB(writeConfig)

создает этот документ в CosmosDB

{
"a": "a",
"c": {
    "d": "d",
    "f": "f",
    "echo": "e"                                 <<-----
},
"id": "509c6c94-139a-4b73-a2dc-1ff424519adb",
"beta": "b",                                    <<-----
"_rid": .....
}

ПочемуЭто так, что порядок элементов изменен в двух примерах.Я хочу, чтобы структура документа была такой же, как в первом примере.Я не уверен, почему изменение e-> echo и b-> beta изменяет структуру документа в CosmosDB.

Кто-нибудь имеет представление о том, почему это происходит и что можно сделать, чтобы решить эту проблему?

1 Ответ

0 голосов
/ 03 января 2019

Cosmos DB на самом деле не хранит JSON как JSON, но разлагает его на структуру ARS:

https://azure.microsoft.com/en-us/blog/a-technical-overview-of-azure-cosmos-db/

Когда вы запрашиваете JSON, он воссоздает его на лету. Подробнее о внутреннем представлении можно узнать здесь, в разделе «Документы как деревья»:

http://www.vldb.org/pvldb/vol8/p1668-shukla.pdf

Почему сохранение порядка свойств важно для вас?

...