我的DataFrame中有一列包含像99 230/256
这样的值。这是一个分数的字符串。这是双重表示是99.8984375
。在Spark中加倍的字符串(带分数)
如何在Spark中应用将这些字符串转换为Double的转换?我正在使用Spark 1.6.2
我的DataFrame中有一列包含像99 230/256
这样的值。这是一个分数的字符串。这是双重表示是99.8984375
。在Spark中加倍的字符串(带分数)
如何在Spark中应用将这些字符串转换为Double的转换?我正在使用Spark 1.6.2
注意:您必须定义自己的函数以应用于数据。 Spark只是使用它,它不是一个内置的功能来执行你所要求的。
既然你没有指定你正在使用哪个API,下面是一个简单集合上的Python回答。
此外,您可以在Spark外完全运行和测试它。
def convertFrac(frac):
parts = frac.split()
whole = numer = 0
denom = 1
if len(parts) == 2:
whole = float(parts[0])
numer, denom = map(float, parts[1].split('/'))
elif len(parts) == 1:
if '/' in parts[0]:
numer, denom = map(float, parts[0].split('/'))
else:
return float(parts[0])
return whole + (numer/denom)
这里有一个样品运行
>>> sc.parallelize(["99 230/256", "1/100"]).map(convertFrac).collect()
[99.8984375, 0.01]
警告,这并不对所有输入信号(特别是底片像"-2 3/5"
需要被写为"-2 -3/5"
)工作 - 它只是你需要什么的例子去做。
我正在使用Scala API,但这绝对有帮助。也没有负值的范围,所以你的功能是完美的。另外,我选择在'spark-sql'的'select'子句中操作列(不确定是否是个好主意),但是我发现在sql中更容易做到这一点(个人偏好,但!)。感谢您的代码。 – Veenit
陷阱。是的,只是简单的价值铸造和字符串拆分。没什么太复杂的。 –
您需要创建一个udf来解析它,计算分数值并返回一个double。 – eliasah
是的。我同意。我正在查看是否可以通过任何预定义的方法处理,但您是正确的。 – Veenit