как преобразовать вложенную таблицу mongodb в спрей данных - PullRequest
0 голосов
/ 04 июля 2018

У меня есть вложенный talbe mongodb и его структура документа, такая как:

{
    "_id" : "35228334dbd1090f6117c5a0011b56b0",
    "brasidas" : [ 
        {
            "key" : "buy",
            "value" : 859193
        }
    ],
    "crawl_time" : NumberLong(1526296211997),
    "date" : "2018-05-11",
    "id" : "44874f4c8c677087bcd5f829b2843e66",
    "initNumber" : 0,
    "repurchase" : 0,
    "source_url" : "http://query.sse.com.cn/commonQuery.do?jsonCallBack=jQuery11120015170331124618408_1526262411932&isPagination=true&sqlId=COMMON_SSE_SCSJ_CJGK_ZQZYSHG_JYSLMX_L&beginDate&endDate&securityCode&pageHelp.pageNo=1&pageHelp.beginPage=1&pageHelp.cacheSize=1&pageHelp.endPage=1&pageHelp.pageSize=25",
    "stockCode" : "600020",
    "stockName" : "ZYGS",
    "type" : "SSE"
}

Я хочу преобразовать его в искровой фрейм данных и извлечь заголовки "key" и "value" из " brasidas " как один столбец соответственно. Просто так:

initNumber  repurchase  key  value   stockName    type    date
    50000      50000    buy  286698    shgf       SSE   2015/3/30  

но есть проблема с формой заголовка "brasidas", она имеет три формы:

  [{ "key" : "buy", "value" : 286698 }] 

  [{ "value" : 15311500, "key" : "buy_free" }, { "value" : 0, "key" : "buy_limited" }]

  [{ "key" :    ""buy_free" " }, { "key" : "buy_limited" }]

поэтому, когда я использую scala для определения StructType , он не подходит для каждого документа, я могу только взять " brasidas " в качестве одного столбца и не смог разделить его на "ключ". вот что я получаю:

 initNumber   repurchase     brasidas     stockName    type   date
  50000        50000    [{ "key" : "buy", "value" : 286698 }]   shgf    SSE 2015/3/30

Это код для получения документа mongodb:

val readpledge =ReadConfig(Map("uri"-> (mongouri_beehive+".pledge")))    
val pledge = getMongoDB.readCollection(sc, readpledge,"initNumber","repurchase","brasidas","stockName","type","date")
                   .selectExpr("cast(initNumber as int) initNumber", "cast(repurchase as int) repurchase","brasidas","stockName","type","date")

1 Ответ

0 голосов
/ 04 июля 2018

Если вы попытаетесь df.printSchema(), вы, вероятно, сможете заметить, что brasidas получил ArrayType. Скорее всего (массив карт). Поэтому я бы предложил реализовать какую-то функцию UDF, которая получает Array в качестве параметра и преобразует его так, как вам нужно.

def arrayProcess(arr: Seq[AnyRef]): Seq[AnyRef] = ???

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...