当前位置: 首页 > 知识库问答 >
问题:

Pyspark 将数据帧字符串列拆分为多个列

韦阳辉
2023-03-14

我正在Spark 3.0.0上执行Spark结构流的示例,为此,我使用了twitter数据。我在Kafka中推送了twitter数据,单个记录如下所示

2020-07-21 10:48:19|1265200268284588034|RT@narendramodi:与@IBM首席执行官@ArvindKrishna先生进行了广泛的互动。我们讨论了几个与技术相关的主题,…|印度海得拉巴

在这里,每个字段都由“|”分隔,字段是

>

  • 日期时间

    用户ID

    推文文本

    位置

    现在在Spark中阅读这条消息,我得到了这样的数据帧

     key |   value 
    -----+-------------------------
         |  2020-07-21 10:48:19|1265200268284588034|RT @narendramodi: Had an extensive interaction with CEO of @IBM, Mr. @ArvindKrishna. We discussed several subjects relating to technology,…|Hyderabad, India
    

    根据这个答案,我在我的应用程序中添加了以下代码块。

    split_col =  pyspark.sql.functions.split(df['value'], '|')
    
    
    df = df.withColumn("Tweet Time", split_col.getItem(0))
    df = df.withColumn("User ID", split_col.getItem(1))
    df = df.withColumn("Tweet Text", split_col.getItem(2))
    df = df.withColumn("Location", split_col.getItem(3))
    df = df.drop("key")
    

    但它给了我这样的输出,

                                A                                                                                                                                                                         |  B   |   C     |   D    |  E  |
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------+---------+--------+-----+
      2020-07-21 10:48:19|1265200268284588034|RT @narendramodi: Had an extensive interaction with CEO of @IBM, Mr. @ArvindKrishna. We discussed several subjects relating to technology,…|Hyderabad, India|2     |    0    |    2   |  0  |
    

    但我想要这样的输出

           Tweet Time      |       User ID           |                            Tweet text                                                                                                        |   Location        |
    -----------------------+-------------------------+----------------------------------------------------------------------------------------------------------------------------------------------+-------------------+
      2020-07-21 10:48:19  |   1265200268284588034   |  RT @narendramodi: Had an extensive interaction with CEO of @IBM, Mr. @ArvindKrishna. We discussed several subjects relating to technology,… |  Hyderabad, India |
    
  • 共有1个答案

    张丁雷
    2023-03-14

    因为它接受一个模式:一个表示正则表达式的字符串。正则表达式字符串应为 Java 正则表达式。

    使用“\\|”按管道拆分,或使用'[|]'

    split_col =  split(df.value, '\\|',)
    
    df = df.withColumn("Tweet Time", split_col.getItem(0))\
        .withColumn("User ID", split_col.getItem(1))\
        .withColumn("Tweet Text", split_col.getItem(2))\
        .withColumn("Location", split_col.getItem(3))\
        .drop("key")
    

    输出:

    +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------+-------------------+-------------------------------------------------------------------------------------------------------------------------------------------+----------------+
    |value                                                                                                                                                                                               |Tweet Time         |User ID            |Tweet Text                                                                                                                                 |Location        |
    +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------+-------------------+-------------------------------------------------------------------------------------------------------------------------------------------+----------------+
    |2020-07-21 10:48:19|1265200268284588034|RT @narendramodi: Had an extensive interaction with CEO of @IBM, Mr. @ArvindKrishna. We discussed several subjects relating to technology,…|Hyderabad, India|2020-07-21 10:48:19|1265200268284588034|RT @narendramodi: Had an extensive interaction with CEO of @IBM, Mr. @ArvindKrishna. We discussed several subjects relating to technology,…|Hyderabad, India|
    |2020-07-21 10:48:19|1265200268284588034|RT @narendramodi: Had an extensive interaction with CEO of @IBM, Mr. @ArvindKrishna. We discussed several subjects relating to technology,…|Hyderabad, India|2020-07-21 10:48:19|1265200268284588034|RT @narendramodi: Had an extensive interaction with CEO of @IBM, Mr. @ArvindKrishna. We discussed several subjects relating to technology,…|Hyderabad, India|
    +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------+-------------------+-------------------------------------------------------------------------------------------------------------------------------------------+----------------+
    
     类似资料:
    • 我有一个数据框架,它有一行和几列。有些列是单个值,有些是列表。所有列表列的长度相同。我想将每个列表列拆分为单独的行,同时保留任何非列表列。 样本DF: 我想要什么: 如果我只有一个列表列,那么只需执行< code>explode就很容易了: 然而,如果我尝试分解<code>c</code>列,我得到的数据帧长度为我想要的平方: 我想要的是-对于每一列,取该列中数组的第n个元素,并将其添加到新行。我

    • 我有下面的spark数据框架。 我必须将上面的数据帧列拆分为多个列,如下所示。 我尝试使用分隔符进行拆分;和限制。但是它也将主题拆分为不同的列。姓名和年龄被组合在一起成一列。我要求所有主题在一列中,只有姓名和年龄在单独的列中。 这在Pyspark有可能实现吗?

    • 理想情况下,我希望这些新列也被命名。

    • 问题内容: 我想将它们分成几个新列。假设我有一个看起来像这样的数据框: 我知道使用: 我可以分割一个字符串。但是,下一步,我想像这样有效地将拆分后的字符串放入新列中: 我可以例如这样做: 但是,如何才能更优雅地达到相同的结果呢? 问题答案: 该方法有一个参数: 带有列名: Python> = 3.6 f字符串的情况更加整洁:

    • 我有一个字符串和一个ArrayList。字符串中有几个单词,用空格隔开,例如“firstword second third”。我想将字符串拆分为几个部分,并将“piece”字符串添加到ArrayList中。

    • 问题内容: 我正在尝试找到一种将String拆分为String数组的方法,并且每当遇到白色香料时就需要对其进行拆分,例如 “嗨,我是保罗” 进入” “嗨”“我”“保罗” 如何使用RegularExpression在split()方法中表示空格? 问题答案: 您需要一个正则表达式,例如,这意味着: 每当遇到至少一个空格时就进行拆分 。完整的Java代码是: