Как создать объект json из столбца dataframe карты типов (ключ: Int, значение: структура) - PullRequest
0 голосов
/ 10 мая 2018

PRODUCT_ID_FETR_MAP из df имеет тип карты (ключ: Int, значение: struct). Я хочу преобразовать этот столбец в объект JSON. DF.printschema ()

|-- PRODUCT_ID_FETR_MAP: map (nullable = true)
 |    |-- key: integer
 |    |-- value: struct (valueContainsNull = true)
 |    |    |-- feat_id: string (nullable = true)
 |    |    |-- feat_value_en: string (nullable = true)
 |    |    |-- feat_value_fr: string (nullable = true)
 |    |    |-- feat_def_key: string (nullable = true)
 |    |    |-- feat_def_name_en: string (nullable = true)
 |    |    |-- feat_def_name_fr: string (nullable = true)
 |    |    |-- feat_def_sortpriority: string (nullable = true)
 |    |    |-- feat_group_id: string (nullable = true)
 |    |    |-- feat_grp_name_en: string (nullable = true)
 |    |    |-- feat_grp_name_fr: string (nullable = true)

Пример -

 Map(0 -> [f2023,Gold,Or,Colour,Colour,couleur,null,fg2004,Hardware,Appareil], 
     1 -> [f2052,16GB,16 Go,DeviceMemory,Internal,Interne,1,fg2006,Memory,Mémoire])

Ожидаемый результат - в объекте json

{"sortpriority":"0","FEATURE_ID":"f2023","VALUE_EN": ""Gold"","VALUE_FR": "Or",
  "DEFN_KEY":"Colour","DISPLAY_NAME_EN":"Colour",
  "DISPLAY_NAME_FR":"couleur","SORT_PRIORITY":"null",
  "feat_group_id":"fg2004","feat_grp_name_en":"Memory",
  "feat_grp_name_fr":"Mémoire" }.........

Может ли кто-нибудь помочь мне?

1 Ответ

0 голосов
/ 10 мая 2018

Для входных данных:

case class FeaturesInfo(feat_id: String, feat_value_en: String, 
feat_value_fr: String, feat_def_key: String, 
feat_def_name_en: String,feat_def_name_fr: String, feat_def_sortPriority: 
String, feat_group_id: String,feat_grp_name_en: String, feat_grp_name_fr: 
String)

val data:Map[Int,FeaturesInfo] = Map(0 -> FeaturesInfo("f2023","Gold","Or","Colour","Colour","couleur",
                                                       "null","fg2004","Hardware","Appareil"), 
                                     1 -> FeaturesInfo("f2052","16GB","16 Go","DeviceMemory","Internal","Interne",
                                                       "1","fg2006","Memory","Mémoire"))

    //defined class FeaturesInfo
    //data: scala.collection.immutable.Map[Int,FeaturesInfo]


    case class jsonResult(key: Int, FEATURE_ID: String, VALUE_EN: String, VALUE_FR: String, 
    DEFN_KEY: String, DISPLAY_NAME_EN: String,DISPLAY_NAME_FR: String, 
    SORT_PRIORITY: String, feat_group_id: String, 
    feat_grp_name_en: String, feat_grp_name_fr: String) 

Преобразовать входные данные в приведенный ниже набор данных или фрейм данных (не имеет значения):

    val ds = data.toSeq.toDS().map(x => jsonResult(x._1,
        x._2.feat_id, x._2.feat_value_en, x._2.feat_value_fr,                                            
        x._2.feat_def_key,x._2.feat_def_name_en, 
        x._2.feat_def_name_fr, x._2.feat_def_sortPriority, 
        x._2.feat_group_id, x._2.feat_grp_name_en, x._2.feat_grp_name_fr))

    //defined class jsonResult
    //ds: org.apache.spark.sql.Dataset[jsonResult]

И после успешного создания набора данных/ ДФ.Результат должен выглядеть следующим образом:

    ds.selectExpr("key","to_json(struct(*)) as value").show(false)

    |0 |{"key":0,"FEATURE_ID":"f2023","VALUE_EN":"Gold","VALUE_FR":"Or",
     "DEFN_KEY":"Colour","DISPLAY_NAME_EN":"Colour","DISPLAY_NAME_FR":"couleur",
     "SORT_PRIORITY":"null","feat_group_id":"fg2004","feat_grp_name_en":"Hardware","feat_grp_name_fr":"Appareil"}|
    |1  |{"key":1,"FEATURE_ID":"f2052","VALUE_EN":"16GB","VALUE_FR":"16Go",
      "DEFN_KEY":"DeviceMemory","DISPLAY_NAME_EN":"Internal","DISPLAY_NAME_FR":"Interne",
      "SORT_PRIORITY":"1","feat_group_id":"fg2006","feat_grp_name_en":"Memory","feat_grp_name_fr":"Mémoire"}|       
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...