2017-04-08 6 views
1

selectまたはfilterのようなDataFrame演算子の参照列に$を使用することについて少し混乱します。

次の文は、仕事:

df.select("app", "renders").show 
df.select($"app", $"renders").show 

しかし、次のような作品で唯一の最初の文:

df.filter("renders = 265").show // <-- this works 
df.filter($"renders" = 265).show // <-- this does not work (!) Why?! 

しかし、これは再び動作します:基本的に

df.filter($"renders" > 265).show 

、何DataFrameの演算子の中でこれは$ですか、いつ使用しますか?

答えて

4

$は、その名前の列に文字列を変換する方法です。 selectのどちらのオプションも、もともとselectが列または文字列のいずれかを受け取ることができるため、元々働いています。 フィルタを実行するときに、が列に数値を割り当てる試みです。一方、比較方法は>である。 =の代わりに===を使用する必要があります。

6

インプリは、まもなく紹介するように、implicitクラスのような多くの異なる形式を取るScala言語の主な機能です。彼らにはさまざまな目的があり、彼らはどれほど有益か危険かというさまざまなレベルの議論が行われています。最終的には、コンパイラにクラスを別のクラスに変換させてスコープに入れさせるだけです。

なぜこの点が重要ですか? SparkではStringToColumnと呼ばれるimplicitクラスがあり、追加機能を持つStringContextが与えられています。 seeのように、StringToColumnは、$メソッドをScalaクラスStringContextに追加します。この方法ではColumnNameが生成され、これはColumnに拡張されます。

この結果、$メソッドでは、Stringとして表される列の名前を、あたかもColumnのように扱うことができます。インプリシットは、賢明に使用されると、このような便利な変換を生成して、開発を容易にします。

それでは、あなたが見つけたものを理解するためにこれを使用してみましょう:

df.select("app","renders").show - implicit変換が適用された後select結果、複数のColumns秒かかるので成功 - selectは、複数のString

df.select($"app",$"renders").showがかかるので成功

df.filter("renders = 265").show - SparkがSQLライクなフィルタをサポートするため、成功しました

df.filter($"renders" = 265).showは - $"renders"implicit変換後のタイプColumnであるため失敗し、Column sが(SQLの場合とは異なり)平等のためのカスタム===operatorを使用しています。

df.filter($"renders" > 265).showは - あなたがColumnimplicit後の変換を使用しているので、成功し>Columnfunctionです。

関連する問題