【问题标题】:How to reinfer datatype of a Spark Dataframe column after updating values in the column in Scala如何在 Scala 中更新列中的值后重新推断 Spark Dataframe 列的数据类型
【发布时间】:2020-09-22 03:10:18
【问题描述】:

这是我原始数据框df的示例

+----+
| mix|
+----+
|   1|
|   2|
| cap|
|   3|
|  53|
|  56|
|  98|
|  90|
+----+

列的当前数据类型为StringType 将值 cap 替换为 0 后,可能有两种情况

  • 列没有更多的字符串值,所以现在所有值都是数字
  • 列有其他字符串值,所以它将保持StringType

如何再次推断数据类型,以便我可以知道替换后列是否为纯数字。如果Numerical,确切的数据类型是IntegerFloatDouble

df.withColumn("mix",when(col("mix") === "cap",0).otherwise(col("mix")))

【问题讨论】:

  • 使用rlike判断每一列是否只包含数字。
  • @Nick 这个函数在 scala spark 中是否可用
  • 是的,它是在 Column 上定义的。
  • rlike 会告诉我所有值是否都是数字,但它不会告诉我更新列的确切数据类型,例如IntegerFloat Double 相应地更新了问题跨度>
  • 为什么不能用rlike来做呢?您可以检测小数点。不要打扰浮点数,只需使用双精度即可。

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


【解决方案1】:
val mix = Seq("1","2","cap","4").toDF("mix")    
mix.printSchema()
root
|-- mix: string (nullable = true)

val after = mix.withColumn("mix",when(col("mix") === "cap",0).otherwise(col("mix")).cast(IntegerType))
after.printSchema()
root
|-- mix: integer (nullable = true)

如果这对你有帮助,请告诉我。

【讨论】:

  • 显式 cast 不是一个选项,因为由于某些其他字符串值,该列仍可能是 StringType。已相应地更新了问题
猜你喜欢
  • 2020-08-22
  • 2018-01-26
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
  • 2020-05-30
  • 2017-06-12
  • 1970-01-01
  • 2020-04-30
相关资源
最近更新 更多