2016-11-28 7 views
0

У меня есть JSon структуру, как это:несколько скоплений на вложенной структуры в одном операторе Спарк

{ 
    "a":5, 
    "b":10, 
    "c":{ 
     "c1": 3, 
     "c4": 5 
    }  
} 

У меня есть dataframe, созданный из этой структуры с несколькими миллионами строк. Мне нужно агрегирование в нескольких таких ключах:

df.agg(count($"b") as "cntB", sum($"c.c4") as "sumC") 

Я просто пропустил синтаксис? Или есть другой способ сделать это? Самое важное Spark должен только сканировать данные один раз для всех агрегатов.

ответ

1

Возможно, но ваш JSON должен быть в одной строке.

Каждая строка = новый объект JSON.

val json = sc.parallelize(
    "{\"a\":5,\"b\":10,\"c\":{\"c1\": 3,\"c4\": 5}}" :: Nil) 
val jsons = sqlContext.read.json(json) 

jsons.agg(count($"b") as "cntB", sum($"c.c4") as "sumC").show 

Хорошо работает - посмотрите, что json отформатирован так, чтобы быть в одной строке.

jsons.printSchema() печатает:

root 
|-- a: long (nullable = true) 
|-- b: long (nullable = true) 
|-- c: struct (nullable = true) 
| |-- c1: long (nullable = true) 
| |-- c4: long (nullable = true) 
+0

Спасибо, вы правы. Просто нашел свою ошибку. Часть «c» данных является разреженной, и во время разбора она была распознана как строка из-за неправильного форматирования входных данных. – Marko

 Смежные вопросы

  • Нет связанных вопросов^_^