DataFrameに99 230/256
のような値を持つ列があります。それは分数のある文字列です。二重表現は99.8984375
です。文字列(小数点付き)をDoubleに変換する
Sparkでこのような文字列をDoubleに変換する変換を適用するにはどうすればよいですか?私はSpark 1.6.2を使用しています
DataFrameに99 230/256
のような値を持つ列があります。それは分数のある文字列です。二重表現は99.8984375
です。文字列(小数点付き)をDoubleに変換する
Sparkでこのような文字列をDoubleに変換する変換を適用するにはどうすればよいですか?私はSpark 1.6.2を使用しています
注:データに適用する独自の関数を定義する必要があります。スパークはそれを使用しているだけで、あなたが求めていることをするための組み込み機能ではありません。
使用している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
Gotcha。うん、単純な値のキャストと文字列の分割。複雑すぎることはありません。 –
解析するためにudfを作成し、端数の値を計算してdoubleを返す必要があります。 – eliasah
はい。同意する。私はこれがあらかじめ定義された方法で処理できるかどうかを見ていましたが、あなたは正しいです。 – Veenit