Как получить только определенный атрибут из столбца в схеме данных? - PullRequest
0 голосов
/ 30 декабря 2018

у меня есть эта схема данных: df:

root
 |-- id: long (nullable = true)
 |-- a: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- _VALUE: string (nullable = true)
 |    |    |-- _href: string (nullable = true)
 |    |    |-- type: string (nullable = true)

Как мне изменить кадр данных таким образом, чтобы столбец a содержал только _href значений, а не _value типа?
Возможно ли это?
Я пробовал что-то подобное, но это неправильно:

df=df.withColumn('a', 'a._href')

Например, это мои данные:

+---+---------------------------------------------------------------------+
|id|                                   a                                  |
+---+---------------------------------------------------------------------+
| 17|[[Gwendolyn Tucke,http://facebook.com],[i have , http://youtube.com]]|
| 23|[[letter, http://google.com],[hihow are you , http://google.co.il]]  |
+---+---------------------------------------------------------------------+

но когда я хочу выглядеть так:

+---+---------------------------------------------+
|id|                                   a          |
+---+---------------------------------------------+
| 17|[[http://facebook.com],[ http://youtube.com]]|
| 23|[[http://google.com],[http://google.co.il]]  |
+---+---------------------------------------------+

ps: я вообще не хочу использовать панд.

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Вы можете просто выбрать a._href и назначить его новому столбцу.Попробуйте это решение Scala.

scala> case class sub(_value:String,_href:String)
defined class sub

scala> val df = Seq((17,Array(sub("Gwendolyn Tucke","http://facebook.com"),sub("i have"," http://youtube.com"))),(23,Array(sub("letter","http://google.com"),sub("hihow are you","http://google.co.il")))).toDF("id","a")
df: org.apache.spark.sql.DataFrame = [id: int, a: array<struct<_value:string,_href:string>>]

scala> df.show(false)
+---+-----------------------------------------------------------------------+
|id |a                                                                      |
+---+-----------------------------------------------------------------------+
|17 |[[Gwendolyn Tucke, http://facebook.com], [i have,  http://youtube.com]]|
|23 |[[letter, http://google.com], [hihow are you, http://google.co.il]]    |
+---+-----------------------------------------------------------------------+


scala> df.select("id","a._href").show(false)
+---+------------------------------------------+
|id |_href                                     |
+---+------------------------------------------+
|17 |[http://facebook.com,  http://youtube.com]|
|23 |[http://google.com, http://google.co.il]  |
+---+------------------------------------------+

Вы можете назначить его новому столбцу

scala> val df2 = df.withColumn("result",$"a._href")
df2: org.apache.spark.sql.DataFrame = [id: int, a: array<struct<_value:string,_href:string>> ... 1 more field]

scala> df2.show(false)
+---+-----------------------------------------------------------------------+------------------------------------------+
|id |a                                                                      |result                                    |
+---+-----------------------------------------------------------------------+------------------------------------------+
|17 |[[Gwendolyn Tucke, http://facebook.com], [i have,  http://youtube.com]]|[http://facebook.com,  http://youtube.com]|
|23 |[[letter, http://google.com], [hihow are you, http://google.co.il]]    |[http://google.com, http://google.co.il]  |
+---+-----------------------------------------------------------------------+------------------------------------------+


scala> df2.printSchema
root
 |-- id: integer (nullable = false)
 |-- a: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- _value: string (nullable = true)
 |    |    |-- _href: string (nullable = true)
 |-- result: array (nullable = true)
 |    |-- element: string (containsNull = true)


scala>
0 голосов
/ 31 декабря 2018

Вы можете попробовать следующий код:

from pyspark.sql.functions import *
df.select("id", explode("a")).select("id","a._href", "a.type").show()

Выше кода вернет DataFrame с 3 столбцами (id, _href, type) на том же уровне, который вы можете использовать для дальнейшего анализа.

Надеюсь, это поможет.

С уважением,

Neeraj

...