2017-12-13 1 views
0

Ich habe einen Datenrahmen (der durch Laden von mehreren Blobs in Azur erstellt wird), wo ich eine Spalte haben, die Liste der IDs ist. Jetzt habe ich eine Liste von eindeutigen IDs aus dieser ganzen Spalte will:Pyspark Dataframe bekommen einzigartige Elemente aus Spalte mit String als Liste der Elemente

Hier ist ein Beispiel -

df - 
| col1 | col2 | col3 | 
| "a" | "b" |"[q,r]"| 
| "c" | "f" |"[s,r]"| 

Hier ist meine erwartete Antwort:

resp = [q, r, s] 

Jede Idee, wie man dorthin ?

Mein derzeitiger Ansatz ist es, die Strings in Col3 in Python-Listen zu konvertieren und sie dann irgendwie zu erweitern.

Aber bis jetzt bin ich nicht dazu in der Lage. Ich habe versucht, benutzerdefinierte Funktionen in pyspark verwenden, aber sie nur Zeichenfolgen und keine Listen zurückgeben.

FlatMaps funktionieren nur mit RDD und nicht mit Datenrahmen, daher sind sie nicht im Bild.

Vielleicht gibt es einen Weg, wo ich dies während der Konvertierung von RDD zu Dataframe angeben kann. Aber nicht sicher, wie das geht.

Antwort

1

wir können UDF zusammen mit collect_list verwenden. Ich habe meinen Weg versucht,

>>> from pyspark.sql import functions as F 
>>> from pyspark.sql.types import * 
>>> from functools import reduce 

>>> df = spark.createDataFrame([('a','b','[q,r]'),('c','f','[s,r]')],['col1','col2','col3']) 
>>> df.show() 
+----+----+-----+ 
|col1|col2| col3| 
+----+----+-----+ 
| a| b|[q,r]| 
| c| f|[s,r]| 
+----+----+-----+ 

>>> udf1 = F.udf(lambda x : [v for v in reduce(lambda x,y : set(x+y),d) if v not in ['[',']',',']],ArrayType(StringType())) 
## col3 value is string of list. we concat the strings and set over it which removes duplicates. 
## Also, we have converted string to set, means it will return [ ] , as values(like '[',']',',').we remove those. 

>>> df.select(udf1(F.collect_list('col3')).alias('col3')).first().col3 
['q', 'r', 's'] 

Nicht sicher über die Leistung. Hoffe das hilft.!

0

ist hier ein Verfahren nur Datenrahmen Funktionen:

df = spark.createDataFrame([('a','b','[q,r,p]'),('c','f','[s,r]')],['col1','col2','col3']) 

df=df.withColumn('col4', f.split(f.regexp_extract('col3', '\[(.*)\]',1), ',')) 

df.select(f.explode('col4').alias('exploded')).groupby('exploded').count().show() 
Verwandte Themen