我一直在使用这段代码将列 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 错误。
你们知道我该如何解决这个问题吗?
谢谢
试试这个方法:
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");
变化:
要转义 Java 正则表达式中的反斜杠,需要使用四个反斜杠 (
\\\\
)。这是因为反斜杠在正则表达式和 Java 字符串中都是转义字符。
正则表达式中分隔符星号(*)也需要转义,所以前面需要两个反斜杠(
\\\\*
)。