【问题标题】:substring multiple characters from the last index of a pyspark string column using negative indexing使用负索引从 pyspark 字符串列的最后一个索引中子串多个字符
【发布时间】:2018-09-22 10:12:31
【问题描述】:

与:Spark Dataframe column with last character of other column 密切相关,但我想从 -1 索引中提取多个字符。


我有以下 pyspark 数据框df

+----------+----------+
|    number|event_type|
+----------+----------+
|0342224022|        11|
|0112964715|        11|
+----------+----------+

我想从 number 列的最后一个索引中提取 3 个字符。

我尝试了以下方法:

from pyspark.sql.functions import substring 
df.select(substring(df['number'], -1, 3), 'event_type').show(2)

# which returns:

+----------------------+----------+
|substring(number,-1,3)|event_type|
+----------------------+----------+
|                     2|        11|
|                     5|        11|
+----------------------+----------+

下面是预期的输出(我不确定上面的输出是什么):

+----------------------+----------+
|substring(number,-1,3)|event_type|
+----------------------+----------+
|                   022|        11|
|                   715|        11|
+----------------------+----------+

我做错了什么?

注意:Spark 版本 1.6.0

【问题讨论】:

    标签: python apache-spark pyspark


    【解决方案1】:

    这就是您使用substring 的方式。你的位置是-3,长度是3。

    pyspark.sql.functions.substring(str, pos, len)
    

    您需要将子字符串函数调用更改为:

    from pyspark.sql.functions import substring
    df.select(substring(df['number'], -3, 3), 'event_type').show(2)
    #+------------------------+----------+
    #|substring(number, -3, 3)|event_type|
    #+------------------------+----------+
    #|                     022|        11|
    #|                     715|        11|
    #+------------------------+----------+
    

    【讨论】:

    • 根据文档,位置不应该是-1:spark.apache.org/docs/1.6.0/api/python/…我目前正在使用移动设备。一旦我可以访问计算机,我将更新。
    • 您需要指定起始位置,然后指定要查看的长度。所以从位置-3开始,寻找3个字符串字符。
    • 你说的是反向数字。请尝试解决方案,然后告诉我它是否为您提供所需的输出。你自己会明白的。
    • 你想要最后 3 个数字,对吗?你不能反过来计算长度。您需要指定一个起始位置,即 -3,即最后 3 个数字的第一个字符。然后从该位置查找 3 个字符。
    • 是的,这行得通。您的第三条评论很有帮助。谢谢。
    【解决方案2】:

    借助“expr”函数,这也可以通过 SQL 代码完成:

    from pyspark.sql.functions import expr
    
    df.select(expr('RIGHT(number, 3) AS substring'), 'event_type').show(2)
    

    【讨论】:

      猜你喜欢
      • 2013-05-30
      • 1970-01-01
      • 2013-05-06
      • 1970-01-01
      • 1970-01-01
      • 2011-08-13
      • 1970-01-01
      • 2013-01-11
      • 1970-01-01
      相关资源
      最近更新 更多