Apache spark 串(带分数)在火花中加倍
我的数据框中有一列,其中包含Apache spark 串(带分数)在火花中加倍,apache-spark,Apache Spark,我的数据框中有一列,其中包含99230/256等值。这是一个带分数的字符串。它的双重表示形式是99.8984375 如何应用转换,将此类字符串转换为Spark中的Double?我使用的是Spark 1.6.2注意:您必须定义自己的函数才能应用于数据。Spark只是使用它,它不是一个内置的功能来满足您的要求 由于您没有指定要使用的API,下面是一个简单集合上的Python答案 此外,您可以完全在Spark之外运行和测试此功能 def convertFrac(frac): parts = f
99230/256
等值。这是一个带分数的字符串。它的双重表示形式是99.8984375
如何应用转换,将此类字符串转换为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]
警告,这并不适用于所有输入(特别是像
“-23/5”
这样的负片需要写成“-2-3/5”
)-这只是您需要做的一个示例 注意:您必须定义自己的函数才能应用于数据。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]
警告,这并不适用于所有输入(特别是像
“-23/5”
这样的负片需要写成“-2-3/5”
)-这只是您需要做的一个示例 您需要创建一个udf来解析它,计算分数值并返回一个double.Yes。我同意。我想看看是否可以用任何预定义的方法来处理这个问题,但是你是对的。你需要创建一个udf来解析它,计算分数值并返回一个double。是的。我同意。我想看看这是否可以通过任何预定义的方法来处理,但你是正确的。我使用的是Scala API,但这肯定有帮助。也没有负值的范围,所以你的函数工作得很完美。另外,我选择了在sparksql
的select
子句中操作列(不确定这是否是个好主意),但我发现在sql中操作该列要容易得多(尽管是个人偏好!)。谢谢你的密码,明白了。是的,只是简单的值转换和字符串拆分。没什么太复杂的。我正在使用Scala API,但这肯定会有所帮助。也没有负值的范围,所以你的函数工作得很完美。另外,我选择了在sparksql
的select
子句中操作列(不确定这是否是个好主意),但我发现在sql中操作该列要容易得多(尽管是个人偏好!)。谢谢你的密码,明白了。是的,只是简单的值转换和字符串拆分。没什么太复杂的。