Pyspark dataframe - получить количество переменных в двух столбцах
Я использую фрейм данных pyspark с целью получить количество переменных, которые могут быть в нескольких столбцах. Написал SQL-запрос, чтобы получить это, но не смог перевести его для кадров данных.
Учитывая приведенный ниже фрейм данных, необходимо получить значения "Foo", "Bar", "Air" в Col1, Col2.
+----------+----+-----+
| ID |Col1|Col2 |
+----------+----+-----+
|2017-01-01| Air| Foo |
|2017-01-02| Foo| Bar|
|2017-01-03| Bar| Air |
|2017-01-04| Air| Foo|
|2017-01-09| Bar| Foo|
|2017-01-01|Foo | Bar|
|2017-01-02|Bar | Air|
|2017-01-01|Foo | Air|
|2017-01-02|Foo | Air|
+----------+----+-----+
Ожидаемый результат
+-------+-----+
|Var . |Count|
+-------+-----+
| Foo| 7 |
| Air| 6 |
| Bar| 5 |
+-------+-----+
1 ответ
Попробуй это:
Создание DataFrame
import pyspark.sql.functions as f
l1 = [('2017-01-01','Air','Foo'),
('2017-01-02','Foo','Bar'),
('2017-01-03','Bar','Air'),
('2017-01-04','Air','Foo'),
('2017-01-09','Bar','Foo'),
('2017-01-01','Foo','Bar'),
('2017-01-02','Bar','Air'),
('2017-01-01','Foo','Air'),
('2017-01-02','Foo','Air')]
df = spark.createDataFrame(l1).toDF('id', 'col1', 'col2')
df.show()
+----------+----+----+
| id|col1|col2|
+----------+----+----+
|2017-01-01| Air| Foo|
|2017-01-02| Foo| Bar|
|2017-01-03| Bar| Air|
|2017-01-04| Air| Foo|
|2017-01-09| Bar| Foo|
|2017-01-01| Foo| Bar|
|2017-01-02| Bar| Air|
|2017-01-01| Foo| Air|
|2017-01-02| Foo| Air|
+----------+----+----+
Первый конкат col1
а также col2
с участием ,
в качестве разделителя. Разделить столбец по ,
а затем взорваться даст ряд для каждого слова.
df.withColumn('col', f.explode(f.split(f.concat('col1',f.lit(','),'col2'),','))).groupBy('col').count().show()
+---+-----+
|col|count|
+---+-----+
|Bar| 5|
|Foo| 7|
|Air| 6|
+---+-----+