如何从每一行的列中提取特定元素?
How to extract particular element from the column for each row?
我在 Spark 2.2.0 和 Scala 2.11.8 中有以下 DataFrame。
+----------+-------------------------------+
|item | other_items |
+----------+-------------------------------+
| 111 |[[444,1.0],[333,0.5],[666,0.4]]|
| 222 |[[444,1.0],[333,0.5]] |
| 333 |[] |
| 444 |[[111,2.0],[555,0.5],[777,0.2]]|
我想获取以下DataFrame:
+----------+-------------+
|item | other_items |
+----------+-------------+
| 111 | 444 |
| 222 | 444 |
| 444 | 111 |
所以,基本上,我需要从每一行的 other_items
中提取第一个 item
。此外,我需要忽略 other_products
.
中具有空数组 []
的那些行
我该怎么做?
我试过这种方法,但它没有给我预期的结果。
result = df.withColumn("other_items",$"other_items"(0))
printScheme
给出以下输出:
|-- item: string (nullable = true)
|-- other_items: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- _1: string (nullable = true)
| | |-- _2: double (nullable = true)
像这样:
val df = Seq(
("111", Seq(("111", 1.0), ("333", 0.5), ("666", 0.4))), ("333", Seq())
).toDF("item", "other_items")
df.select($"item", $"other_items"(0)("_1").alias("other_items"))
.na.drop(Seq("other_items")).show
其中第一个apply
($"other_items"(0)
)选择数组的第一个元素,第二个apply
(_("_1")
)selects
_1
字段,并且 na.drop
删除由空数组引入的 nulls
。
+----+-----------+
|item|other_items|
+----+-----------+
| 111| 111|
+----+-----------+
我在 Spark 2.2.0 和 Scala 2.11.8 中有以下 DataFrame。
+----------+-------------------------------+
|item | other_items |
+----------+-------------------------------+
| 111 |[[444,1.0],[333,0.5],[666,0.4]]|
| 222 |[[444,1.0],[333,0.5]] |
| 333 |[] |
| 444 |[[111,2.0],[555,0.5],[777,0.2]]|
我想获取以下DataFrame:
+----------+-------------+
|item | other_items |
+----------+-------------+
| 111 | 444 |
| 222 | 444 |
| 444 | 111 |
所以,基本上,我需要从每一行的 other_items
中提取第一个 item
。此外,我需要忽略 other_products
.
[]
的那些行
我该怎么做?
我试过这种方法,但它没有给我预期的结果。
result = df.withColumn("other_items",$"other_items"(0))
printScheme
给出以下输出:
|-- item: string (nullable = true)
|-- other_items: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- _1: string (nullable = true)
| | |-- _2: double (nullable = true)
像这样:
val df = Seq(
("111", Seq(("111", 1.0), ("333", 0.5), ("666", 0.4))), ("333", Seq())
).toDF("item", "other_items")
df.select($"item", $"other_items"(0)("_1").alias("other_items"))
.na.drop(Seq("other_items")).show
其中第一个apply
($"other_items"(0)
)选择数组的第一个元素,第二个apply
(_("_1")
)selects
_1
字段,并且 na.drop
删除由空数组引入的 nulls
。
+----+-----------+
|item|other_items|
+----+-----------+
| 111| 111|
+----+-----------+