输入\输出\图像
如图所示,input df有一列“columnvalues”和字符串值,需要创建两列“value\u number”和“value\u string”的输出数据框,解析“columnvalues”字符串后必须包含值。如果是字符串值,则应转到“值\字符串”列;如果是数字值,则应转到“值\数字”列。我有非常巨大的数据,需要有效地创建这个输出。
输入\输出\图像
如图所示,input df有一列“columnvalues”和字符串值,需要创建两列“value\u number”和“value\u string”的输出数据框,解析“columnvalues”字符串后必须包含值。如果是字符串值,则应转到“值\字符串”列;如果是数字值,则应转到“值\数字”列。我有非常巨大的数据,需要有效地创建这个输出。
3条答案
按热度按时间mefy6pfw1#
您可以通过以下简单的Map函数来实现,
加载Dataframe
尝试Map到双精度
如果它是一个成功Map,则显式地将其转换为else赋值0.0
如果双重强制转换失败,则将其强制转换为字符串或空字符串
shyt4zoc2#
使用
cast
&when
把价值投给double
如果它能够成功地转换double值,它将返回number
其他null
那你看看这个null
内部when
功能。检查以下代码。
解决方案1-使用
withColumn
&when
```scala> df.show(false)
+------------+
|columnvalues|
+------------+
|Maharashtra |
|23432.53 |
|Karnataka |
|424244 |
|Goa |
+------------+
scala> df
.withColumn("value_number",when(
!$"columnvalues".cast("double").isNull,
$"columnvalues"
).otherwise(0.0)
)
.withColumn("value_string",when(
$"columnvalues".cast("double").isNull,
$"columnvalues"
).otherwise("")
)
.show(false)
+------------+------------+------------+
|columnvalues|value_number|value_string|
+------------+------------+------------+
|Maharashtra |0.0 |Maharashtra |
|23432.53 |23432.53 | |
|Karnataka |0.0 |Karnataka |
|424244 |424244 | |
|Goa |0.0 |Goa |
+------------+------------+------------+
解决方案3-使用
when
&struct
```val expr = when(
!$"columnvalues".cast("double").isNull,
struct(
$"columnvalues".cast("double").as("value_number"),
lit("").as("value_string")
)
).otherwise(
struct(
lit(0.0).cast("double").as("value_number"),
$"columnvalues".as("value_string")
)
).as("value")
scala> df.select($"columnvalues",expr).select($"columnvalues",$"value.*").show(false)
+------------+------------+------------+
|columnvalues|value_number|value_string|
+------------+------------+------------+
|Maharashtra |0.0 |Maharashtra |
|23432.53 |23432.53 | |
|Karnataka |0.0 |Karnataka |
|424244 |424244.0 | |
|Goa |0.0 |Goa |
+------------+------------+------------+
mo49yndu3#
我试过一个类似的例子
我希望这也适用于你的数据。