2016-08-04 35 views
0

我的DataFrame中有一列包含像99 230/256这样的值。这是一个分数的字符串。这是双重表示是99.8984375在Spark中加倍的字符串(带分数)

如何在Spark中应用将这些字符串转换为Double的转换?我正在使用Spark 1.6.2

+1

您需要创建一个udf来解析它,计算分数值并返回一个double。 – eliasah

+0

是的。我同意。我正在查看是否可以通过任何预定义的方法处理,但您是正确的。 – Veenit

回答

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")工作 - 它只是你需要什么的例子去做。

+0

我正在使用Scala API,但这绝对有帮助。也没有负值的范围,所以你的功能是完美的。另外,我选择在'spark-sql'的'select'子句中操作列(不确定是否是个好主意),但是我发现在sql中更容易做到这一点(个人偏好,但!)。感谢您的代码。 – Veenit

+0

陷阱。是的,只是简单的价值铸造和字符串拆分。没什么太复杂的。 –