SparkSQL获取单词的所有前缀

时间:2019-06-13 18:11:46

标签: apache-spark apache-spark-sql

说我在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._中的代码生成最佳函数的解决方案)

1 个答案:

答案 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|
+------+