【发布时间】:2019-01-08 01:01:48
【问题描述】:
我有一个json数据集,格式如下,每行一个条目。
{ "sales_person_name" : "John", "products" : ["apple", "mango", "guava"]}
{ "sales_person_name" : "Tom", "products" : ["mango", "orange"]}
{ "sales_person_name" : "John", "products" : ["apple", "banana"]}
{ "sales_person_name" : "Steve", "products" : ["apple", "mango"]}
{ "sales_person_name" : "Tom", "products" : ["mango", "guava"]}
我想知道谁卖的芒果最多等等。 因此,我想将文件加载到数据帧并为每个事务的数组中的每个产品值发出一个(键,值)对(产品,名称)。
var df = spark.read.json("s3n://sales-data.json")
df.printSchema()
root
|-- sales_person_name: string (nullable = true)
|-- products: array (nullable = true)
var nameProductsMap = df.select("sales_person_name", "products").show()
+-----------------+--------------------+
|sales_person_name| products |
+-----------------+--------------------+
| John|[mango, apple,... |
| Tom|[mango, orange,... |
| John|[apple, banana... |
var resultMap = df.select("products", "sales_person_name")
.map(r => (r(1), r(0)))
.show() //This is where I am stuck.
我无法找出正确的方法来爆炸()行(0)并使用行(1)值发出一次所有值。任何人都可以提出一种方法。谢谢!
预期输出:
Mango : John(4), Tom(2), Greg(1)...
Banana: Tom(5), John(2), ...
【问题讨论】:
-
我正在尝试类似: var actorHashtagsMap = df.select("products", "sales_person_name").map(r => { r(0).map(x => (x, r (1))) })
标签: scala apache-spark dataframe apache-spark-sql