说我在SparkSQL DataFrame中有这样的列:
+-------+
| word |
+-------+
| chair |
| lamp |
| table |
+-------+
我想像这样爆炸所有前缀:
+--------+
| prefix |
+--------+
| c |
| ch |
| cha |
| chai |
| chair |
| l |
| la |
| lam |
| lamp |
| t |
| ta |
| tab |
| tabl |
| table |
+--------+
有没有一种好的方法,而无需使用udfs或Spark sql中的功能编程方法(例如flatMap
)呢? (我正在谈论使用org.apache.spark.sql.functions._
中的代码生成最佳函数的解决方案)
答案 0 :(得分:3)
从技术上讲,这是可能的,但我怀疑它的性能是否会比简单的flatMap
好(如果性能是避免使用flatMap
的原因):
val df = Seq("chair", "lamp", "table").toDF("word")
df.withColumn("len", explode(sequence(lit(1), length($"word"))))
.select($"word".substr(lit(1), $"len") as "prefix")
.show()
输出:
+------+
|prefix|
+------+
| c|
| ch|
| cha|
| chai|
| chair|
| l|
| la|
| lam|
| lamp|
| t|
| ta|
| tab|
| tabl|
| table|
+------+