【问题标题】:How to convert a String into a List using spark function PySpark如何使用火花函数 PySpark 将字符串转换为列表
【发布时间】:2019-01-14 22:59:36
【问题描述】:

我正在从数据框中获取一列。该列是string 类型。

x = "[{somevalues, id:1, name:'xyz'}, {address:Some Value}, {somevalue}]" 等等..

数据以字符串形式存储。它可以很容易地表示为一个列表。 我希望输出为:

LIST of [
{somevalues, id:1, name:'xyz'}, 
{address:Some Value}, 
{somevalue}
]

如何使用 Spark 的 API 实现这一点?我知道在 Python 中我可以使用 eval(x) 函数,它会返回列表,或者我可以使用 x.split() 函数,它也会返回一个列表。但是,在这种方法中,它需要对每条记录进行迭代。

另外,我想使用mapPartition;这就是为什么我需要我的字符串列在一个列表中以便我可以将它传递给mapPartition

有没有一种有效的方法,我也可以使用 spark API 转换我的字符串数据,或者mapPartitions 会更好,因为我将循环每个分区而不是每个记录?

【问题讨论】:

    标签: python apache-spark pyspark apache-spark-sql


    【解决方案1】:

    您可以使用 regexp_replace 删除方括号,然后在逗号上拆分。起初,我认为您需要做一些特别的事情来避免在大括号内的逗号上分裂。但似乎 spark sql 会自动避免这种情况。例如,Zeppelin 中的以下查询

    %sql
    select split(regexp_replace("[{somevalues, id:1, name:'xyz'}, {address:Some Value}, {somevalue}]",  "[\\[\\] ]", ""), ",")
    

    给我

    WrappedArray({somevalues, id:1, name:'xyz'}, {address:SomeValue}, {somevalue})
    

    这就是你想要的。

    如果您正在使用数据框,则可以使用 withColumn 以这种方式添加列。并且由于某种原因,如果大括号内的逗号被拆分,您可以在这篇文章中执行更多的 regex-foo - Regex: match only outside parenthesis (so that the text isn't split within parenthesis)?

    希望这是有道理的。我不确定您是否使用数据帧,但建议在较低级别的 RDD api 上使用它们。

    【讨论】:

    • 我不希望使用 Dataframe,因为稍后我需要对 RDD 进行处理。我正在使用 Python,所以不能使用数据集
    • @AJm,将数据帧转换为 rdd 非常简单,只需调用 .rdd
    • 不起作用。给出错误 sql() 恰好需要 2 个参数(给定 3 个)。因为我已将“[{somevalues, id:1, name:'xyz'}, {address:Some Value}, {somevalue}]”替换为列名
    • @AJm,你能用你的尝试和详细的错误信息更新问题吗?
    • df = spark.sql("select split(regexp_replace(column_name, ""[\[\] ]"", ""), ",") from table_1 ") ; df.show(10)
    【解决方案2】:

    如果你不想去dataframes那么你可以在上使用regex replacesplit函数rdd 你创建的数据。

    如果你有数据为

    x = "[{somevalues, id:1, name:'xyz'}, {address:Some Value}, {somevalue}]"
    

    然后就可以创建rdd并使用regex replacesplit函数作为

    import re
    rdd = sc.parallelize([x]).flatMap(lambda x: re.sub("},\\{", "};&;{", re.sub("[\\[\\]\s+]", "", x)).split(";&;"))
    

    flatMap 用于拆分后的数据位于单独的行中

    {somevalues,id:1,name:'xyz'}
    {address:SomeValue}
    {somevalue}
    

    希望回答对你有帮助

    注意:如果您想要dataframe 方式的解决方案,那么您可以从我的other answer 获得想法

    【讨论】:

      猜你喜欢
      • 2018-02-18
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-16
      • 2017-12-19
      • 1970-01-01
      • 2021-10-21
      相关资源
      最近更新 更多