【问题标题】:How to use length function in lpad, where the length of lpad is decided based on the column valuelpad中如何使用length函数,其中lpad的长度是根据列值决定的
【发布时间】:2020-10-16 04:45:45
【问题描述】:

我有一列包含val a = List(123,656,453,7889,64396) 的值。 我想使用像lpad(col("a"), a.length, "0") 这样的lpad。基本上,我不确定列表中数字的长度,所以我必须检查每个数字的长度,然后用 Os 填充它。

基本上我有这个输入数据框: (00123,000656,000453,007889,064396)。并申请

val getRandom = udf((seed: String) => new Random(seed).shuffle(seed.toCharArray.iterator).mkString("")

在数据框上。但是我的随机化输出删除了 0。我想把它画出来。

| inpCol     |  newCol |
------------------------
|  154200231 |     123 |
| 2343000566 |     656 |
| 6543000453 |     345 |

【问题讨论】:

  • 你的意思是left pad还是lpad到底是什么?
  • lpad 功能准确
  • 你能显示你想要的输出吗?
  • 好的,我有一个解决方案。我说对了吗,a 已经将这些数字作为字符串包含了?
  • 我正在使用 val a= sqlContext.table(tbl).select("colNm").collect.map(_(0)).toString

标签: scala apache-spark apache-spark-sql scala-collections


【解决方案1】:

我建议先找出a 中任何数字字符串的最大长度

val a = List(123,656,453,7889,64396)
val length = a.map(_.length).max

lpad(col("a"), length, "0")

然后用它来填充它们。

【讨论】:

  • 这适用于所有数字.. 但我希望每个数字都按照位数填充。
【解决方案2】:

根据您对@Yann 帖子的评论,您希望每个数字都按照位数进行填充:

你可以试试这个。

import org.apache.spark.sql.functions.lpad


def lpadFunc() = {
   expr("lpad(a, length(a)*2, '0')").as("LPAD")
}

df.select("a", lpadFunc())

输出:

+--------------+----------+
|       a      |    LPAD  |
+--------------+----------+
|           111|    000111|
|          2224|  00002224|
|         33435|0000033435|
+--------------+----------+

此函数的作用是:它将采用列“a”的长度并将其加倍 - 然后应用 lpadding。这样,与列中每个值的长度相同数量的零将被填充到每个列值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-17
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多