代码之家  ›  专栏  ›  技术社区  ›  cph_sto

在Spark版本2.2中使用row\ u number()函数创建PySpark数据帧中每一行的行号

  •  1
  • cph_sto  · 技术社区  · 7 年前

    我有一个Pypark数据帧-

    valuesCol = [('Sweden',31),('Norway',62),('Iceland',13),('Finland',24),('Denmark',52)]
    df = sqlContext.createDataFrame(valuesCol,['name','id'])
    +-------+---+
    |   name| id|
    +-------+---+
    | Sweden| 31|
    | Norway| 62|
    |Iceland| 13|
    |Finland| 24|
    |Denmark| 52|
    +-------+---+
    

    我的最终输出应该是:

    +-------+---+--------+
    |   name| id|row_num |
    +-------+---+--------+
    | Sweden| 31|       1|
    | Norway| 62|       2|
    |Iceland| 13|       3|
    |Finland| 24|       4|
    |Denmark| 52|       5|
    +-------+---+--------+
    

    我的Spark版本是 2.2

    我正在尝试这个代码,但它不起作用-

    from pyspark.sql.functions import row_number
    from pyspark.sql.window import Window
    w = Window().orderBy()
    df = df.withColumn("row_num", row_number().over(w))
    df.show()
    

    我得到一个错误:

    AnalysisException: 'Window function row_number() requires window to be ordered, please add ORDER BY clause. For example SELECT row_number()(value_expr) OVER (PARTITION BY window_partition ORDER BY window_ordering) from table;'
    

    如果我理解正确,我需要订一些专栏,但我不想要这样的东西 w = Window().orderBy('id')

    有人能建议如何使用 row_number() 功能?

    1 回复  |  直到 7 年前
        1
  •  20
  •   Ali Yesilli    7 年前

    您应该为order子句定义列。如果不需要对值进行排序,则编写一个伪值。试试下面;

    from pyspark.sql.functions import row_number,lit
    from pyspark.sql.window import Window
    w = Window().orderBy(lit('A'))
    df = df.withColumn("row_num", row_number().over(w))
    
    推荐文章