Scala 如何使用分隔符在火花中爆炸

Scala 如何使用分隔符在火花中爆炸,scala,apache-spark,explode,Scala,Apache Spark,Explode,我有一张桌子: id项目名称优惠券 1项(食物条)可用,soaps正确 2项(条形图)可用错误 3香皂、洗发水、假发 4项(foo-bar,bar)可用 5项(食物棒、酒吧)可用,(肥皂、洗发水)正确 6空-假 我想把它炸开 id项目名称优惠券 1项(食物条)可用真实 肥皂剧是真的 2项(条形图)可用错误 3肥皂是假的 3.羞耻是假的 4项(foo-bar,bar)可用 5项(foo-bar,bar)可用 6(肥皂、洗发水)正确 6空为真 当我这样做时: df.withColumn("item

我有一张桌子:

id项目名称优惠券 1项(食物条)可用,soaps正确 2项(条形图)可用错误 3香皂、洗发水、假发 4项(foo-bar,bar)可用 5项(食物棒、酒吧)可用,(肥皂、洗发水)正确 6空-假

我想把它炸开

id项目名称优惠券 1项(食物条)可用真实
肥皂剧是真的 2项(条形图)可用错误 3肥皂是假的 3.羞耻是假的 4项(foo-bar,bar)可用 5项(foo-bar,bar)可用 6(肥皂、洗发水)正确
6空为真

当我这样做时:

 df.withColumn("itemNames", explode(split($"itemNames", "[,]")))
我得到:

itemNames                                          coupons
item (foo bar) is available                        true       
soaps                                              true 
item (bar) is available                            false
soaps                                              false
shampoo                                            false
item (foo bar,                                     true
bar) is available                                  true 
(soap,                                             true    
shampoo)                                           true

有人能告诉我我做错了什么,我该如何纠正?这里常见的一种模式是逗号出现在()中。

您的问题没有向后拆分字符串的模式。下面是一个变通方法,适用于这种特殊情况。我用lookback操作除以“available”。在您的数据帧爆炸中尝试此方法

scala> "item (foo bar) is available, soaps".split("(?<=available),")
res41: Array[String] = Array(item (foo bar) is available, " soaps")

scala> "item (foo bar) is available, soaps".split("(?<=available),").length
res42: Int = 2

scala> "item (foo bar, bar) is available".split("(?<=available),")
res44: Array[String] = Array(item (foo bar, bar) is available)

scala> "item (foo bar, bar) is available".split("(?<=available),").length
res45: Int = 1

scala>“项(foo-bar)可用,soaps”。split((?您的问题没有向后拆分字符串的模式。下面是一个解决方法,适用于这种特殊情况。我使用lookback操作除以“可用”。请在数据帧分解中尝试此方法

scala> "item (foo bar) is available, soaps".split("(?<=available),")
res41: Array[String] = Array(item (foo bar) is available, " soaps")

scala> "item (foo bar) is available, soaps".split("(?<=available),").length
res42: Int = 2

scala> "item (foo bar, bar) is available".split("(?<=available),")
res44: Array[String] = Array(item (foo bar, bar) is available)

scala> "item (foo bar, bar) is available".split("(?<=available),").length
res45: Int = 1
scala>“项目(foo-bar)可用,soaps”。使用自定义项拆分((?),灵感来自:

输出为:

+--------------------------------+-------+
|itemNames                       |coupons|
+--------------------------------+-------+
|item (foo bar) is available     |true   |
| soaps                          |true   |
|item (bar) is available         |false  |
|soaps                           |false  |
| shampoo                        |false  |
|item (foo bar, bar) is available|true   |
|item (foo bar, bar) is available|true   |
| (soap, shampoo)                |true   |
+--------------------------------+-------+
如果需要“修剪”,可以轻松地添加到“自定义拆分”中。

使用自定义项,灵感来自:

输出为:

+--------------------------------+-------+
|itemNames                       |coupons|
+--------------------------------+-------+
|item (foo bar) is available     |true   |
| soaps                          |true   |
|item (bar) is available         |false  |
|soaps                           |false  |
| shampoo                        |false  |
|item (foo bar, bar) is available|true   |
|item (foo bar, bar) is available|true   |
| (soap, shampoo)                |true   |
+--------------------------------+-------+

如果需要“trim”,可以轻松地添加到“customSplit”中。

Yeah.。只有当值在末尾可用时,才会这样做。但我正在寻找一种更通用的方法,因为我的数据也有其他值。如果您知道不同的其他值,可以替换它们。请参阅我的EDIT1,否则您需要编写udf(),执行正则表达式并返回一个数组,然后分解。是的..只有当值在末尾可用时才会这样做。但我正在寻找一种更通用的方法,因为我的数据也有其他值如果你知道不同的其他值,你可以将其替换..请参阅我的EDIT1,否则你需要编写一个udf(),执行正则表达式并返回一个数组,然后分解。Im get-无法执行用户定义的函数($anonfun$1:(string)=>array)。你能提供更多的跟踪吗?失败的原因是什么?用堆栈跟踪更新了查询。你能让我知道我是否做错了什么吗?Nvm,我认为它的NPE。需要更多的跟踪,只提供指定的功能失败。原因(NPE等)可以更深入地跟踪。如果其NPE、guess、UDF可以改进。Im获取-无法执行用户定义的函数($anonfun$1:(字符串)=>array)。你能提供更多的跟踪吗?失败的原因是什么?用堆栈跟踪更新了查询。你能告诉我我是否做错了什么吗?Nvm,我认为它的NPE。需要更多的跟踪,只提供指定的功能失败。原因(NPE等)可以更深入的跟踪。如果它的NPE,猜测,UDF可以改进。