Python 如何将索引添加到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,

我有一个PySpark数据帧,如:

|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]