Python 如何将索引添加到PySpark数据帧中?
我有一个PySpark数据帧,如:Python 如何将索引添加到PySpark数据帧中?,python,indexing,pyspark,databricks,Python,Indexing,Pyspark,Databricks,我有一个PySpark数据帧,如: |id1 | id2 | ------------ |100 |abcd | |201 |efgh | |112 |ijkl | |133 |mnop | 以及id2s的python列表,如: mylist = ['abcd', 'ijkl', 'efgh', 'efgh', 'abcd', 'ijkl', 'ijkl'] 我想使用pyspark数据框将列表中的值映射到相应的id1值,因此: desired_result = [100, 112, 201,
|id1 | id2 |
------------
|100 |abcd |
|201 |efgh |
|112 |ijkl |
|133 |mnop |
以及id2
s的python列表,如:
mylist = ['abcd', 'ijkl', 'efgh', 'efgh', 'abcd', 'ijkl', 'ijkl']
我想使用pyspark数据框将列表中的值映射到相应的id1
值,因此:
desired_result = [100, 112, 201, 201, 100, 112, 112]
我现在正在用Pandas做这件事,但这样做需要很长时间,因为查找表有数百万行。我怎样才能在PySpark中做到这一点
df2
:[(0, 'abcd'), (1, 'ijkl'), (2, 'efgh'), (3, 'efgh'), (4, 'abcd'), (5, 'ijkl'), (6, 'ijkl')]
+---+----+
|id1| id2|
+---+----+
|100|abcd|
|201|efgh|
|112|ijkl|
|133|mnop|
|245| qrt|
+---+----+
+---+----+
| id|name|
+---+----+
| 0|abcd|
| 1|ijkl|
| 2|efgh|
| 3|efgh|
| 4|abcd|
| 5|ijkl|
| 6|ijkl|
id
列保持原始顺序+---+----+---+----+
| id|name|id1| id2|
+---+----+---+----+
| 0|abcd|100|abcd|
| 1|ijkl|112|ijkl|
| 2|efgh|201|efgh|
| 3|efgh|201|efgh|
| 4|abcd|100|abcd|
| 5|ijkl|112|ijkl|
| 6|ijkl|112|ijkl|
+---+----+---+----+
[100, 112, 201, 201, 100, 112, 112]
为什么不从列表中创建一个数据框,并将其与查找数据框连接起来呢?
df.join(spark.createDataFrame([(x,)表示mylist中的x),“id2]”,on=“id2”)。选择(“id1”).show()
。如果希望将结果放入列表中,您可以收集
结果,还可以广播
第二个数据帧,因为它很小。(注意:小心不要依赖列表中元素的顺序。)这适用于我的用例!非常感谢:)我想没有什么特别的索引。
df = df2.join(df1, df1.id2==df2.name).orderBy('id')
df.show()
[r.id1 for r in df.select('id1').collect()]
+---+----+---+----+
| id|name|id1| id2|
+---+----+---+----+
| 0|abcd|100|abcd|
| 1|ijkl|112|ijkl|
| 2|efgh|201|efgh|
| 3|efgh|201|efgh|
| 4|abcd|100|abcd|
| 5|ijkl|112|ijkl|
| 6|ijkl|112|ijkl|
+---+----+---+----+
[100, 112, 201, 201, 100, 112, 112]