2016-11-26 3 views
1

У меня есть следующий код.Spark 1.6 scala создать строки данных

val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc) 
val baseDF = sqlContext.read.json(fileFullPath) 

У моего json есть 2 поля интереса: ProductId и количество. То, что я ищу

{ 
    "sales": { 
     "saledate": "17Mar2008", 
     "sale": [{ 
      "productid": 1, 
      "quantity": 10 
     }, { 
      "productid": 2, 
      "quantity": 1 
     }, { 
      "productid": 3, 
      "quantity": 3 
     }, { 
      "productid": 4, 
      "quantity": 5 
     }] 
    } 
} 

Я хочу изменить это к свече РДУ или DF, который имеет 2 колонки, ProductID и количество, но несколько строк на основе количества. Я хочу 1 за каждое количество.

В приведенном выше примере продукт 1 имеет 10 рядов, продукт 2 имеет 1, продукт 3 имеет 3, а продукт 4 имеет 5 рядов для 19 строк, т. Е. # Rows = сумма (количество).

Любая помощь приветствуется. Я использую искру 1.6.2 и scala.

+0

Пожалуйста, переформатируйте свой вопрос, в настоящее время он полностью не читается –

+0

извините ... первый пост на стек .. спасибо: @gasparms – SSC

+0

без проблем - я написал это, потому что другие могут опробовать вопрос, из-за плохого форматирования;) –

ответ

0

Это должно сделать вещь:

import org.apache.spark.sql.functions._ 

val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc) 
import sqlContext.implicits._ 

val baseDF = sqlContext.read.json(fileFullPath) 
val listFromQuantity = udf { quantity: Int => List.fill(quantity)(quantity) } 

baseDF.select(explode($"sales.sale")).select($"col.productId", explode(listFromQuantity($"col.quantity"))).show() 

который возвращает:

+---------+--------+ 
|productId|quantity| 
+---------+--------+ 
|  1|  10| 
|  1|  10| 
|  1|  10| 
|  1|  10| 
|  1|  10| 
|  1|  10| 
|  1|  10| 
|  1|  10| 
|  1|  10| 
|  1|  10| 
|  2|  1| 
|  3|  3| 
|  3|  3| 
|  3|  3| 
|  4|  5| 
|  4|  5| 
|  4|  5| 
|  4|  5| 
|  4|  5| 
+---------+--------+ 

Если вы хотите иметь одну величину во втором столбце (например, имеют значение 1 вместо 5) вы должны заменить List.fill(quantity)(quantity) на List.fill(quantity)(1)

+0

Работали как обаяние .... спасибо вам много. .. – SSC