使用 pyspark 和 Java 在元字符 * 处进行 Split()

问题描述 投票:0回答:1

我一直在使用这段代码将列 name_surname 分成 2 个不同的列。 name_surname 列的内容存储方式如下:

David*Green
,因此这些查询的目的是将内容分为 2 列 name 和 surname,其中找到“*”。

java中的查询如下:

final String addressQuery = String.format(
                "select '104' as id, " +
                        "trim(split(name_surname,'\\*')[1]) as name, " +
                        "trim(split(name_surname,'\\*')[0]) as surname, " +
                        "address, " +
                        "zip , " +
                        "from address_info ");

然后将其保存为数据框:

DataFrame addressInt = sqlContext.sql(addressQuery);

像这样运行这个字符串时,出现以下异常: java.util.regex.PatternSyntaxException:索引 0 附近的悬空元字符“*”

阅读另一篇 stackoverflow 帖子后,我发现对于 pyspark,应在分割行中按如下方式修改相同的查询:

"trim(split(name_surname,'\\\\*')[1]) as name, " +
"trim(split(name_surname,'\\\\*')[0]) as surname, " 

但是执行时出现 NullPointerException 错误。

你们知道我该如何解决这个问题吗?

谢谢

java dataframe pyspark hive string-formatting
1个回答
0
投票

试试这个方法:

final String addressQuery = String.format(
    "SELECT '104' AS id, " +
    "TRIM(SPLIT(name_surname, '\\\\\\\\*')[1]) AS name, " +
    "TRIM(SPLIT(name_surname, '\\\\\\\\*')[0]) AS surname, " +
    "address, " +
    "zip " +
    "FROM address_info");

变化:

  1. 要转义 Java 正则表达式中的反斜杠,需要使用四个反斜杠 (

    \\\\
    )。这是因为反斜杠在正则表达式和 Java 字符串中都是转义字符。

  2. 正则表达式中分隔符星号(*)也需要转义,所以前面需要两个反斜杠(

    \\\\*
    )。

© www.soinside.com 2019 - 2024. All rights reserved.