web-dev-qa-db-ja.com

Sparkのデータフレームで列を「負の選択」する方法

わかりませんが、簡単だと思います。 spark dataframe df。このdfには列「A」、「B」、「C」があります。このdfの列の名前を含む配列があるとします。

_column_names = Array("A","B","C")
_

選択する列notを指定できるような方法でdf.select()を実行したいと思います。例:列「B」を選択したくないとしましょう。私は試した

_df.select(column_names.filter(_!="B"))
_

しかし、これは機能しません。

org.Apache.spark.sql.DataFrameは(Array [String])に適用できません

したがって、 here それは、代わりにSeqで動作するはずだと言っています。しかし、しようと

_df.select(column_names.filter(_!="B").toSeq)
_

結果として

org.Apache.spark.sql.DataFrameは(Seq [String])に適用できません。

私は何を間違えていますか?

19
Blaubaer

Since Spark 1.4 を使用できます drop メソッド:

スカラ

case class Point(x: Int, y: Int)
val df = sqlContext.createDataFrame(Point(0, 0) :: Point(1, 2) :: Nil)
df.drop("y")

Python

df = sc.parallelize([(0, 0), (1, 2)]).toDF(["x", "y"])
df.drop("y")
## DataFrame[x: bigint]
36
zero323

私は同じ問題を抱えており、この方法で解決しました(oaffdfはデータフレームです):

val dropColNames = Seq("col7","col121")
val featColNames = oaffdf.columns.diff(dropColNames)
val featCols = featColNames.map(cn => org.Apache.spark.sql.functions.col(cn))
val featsdf = oaffdf.select(featCols: _*)

https://forums.databricks.com/questions/2808/select-dataframe-columns-from-a-sequence-of-string.html

8
Edi Bice

わかりにくいですが、thisいですが、このクイックspark=

scala> val myRDD = sc.parallelize(List.range(1,10))
myRDD: org.Apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[17] at parallelize at <console>:21

scala> val myDF = myRDD.toDF("a")
myDF: org.Apache.spark.sql.DataFrame = [a: int]

scala> val myOtherRDD = sc.parallelize(List.range(1,10))
myOtherRDD: org.Apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[20] at parallelize at <console>:21

scala> val myotherDF = myRDD.toDF("b")
myotherDF: org.Apache.spark.sql.DataFrame = [b: int]

scala> myDF.unionAll(myotherDF)
res2: org.Apache.spark.sql.DataFrame = [a: int]

scala> myDF.join(myotherDF)
res3: org.Apache.spark.sql.DataFrame = [a: int, b: int]

scala> val twocol = myDF.join(myotherDF)
twocol: org.Apache.spark.sql.DataFrame = [a: int, b: int]

scala> val cols = Array("a", "b")
cols: Array[String] = Array(a, b)

scala> val selectedCols = cols.filter(_!="b")
selectedCols: Array[String] = Array(a)

scala> twocol.select(selectedCols.head, selectedCols.tail: _*)
res4: org.Apache.spark.sql.DataFrame = [a: int]

Varargsを必要とする関数に提供することは、 otherSO question で扱われます。 selectのシグネチャは、選択した列のリストが空でないことを確認するためにあります。これにより、選択した列のリストから varargs への変換がもう少し複雑になります。

5
huitseeker
val columns = Seq("A","B","C")

df.select(columns.diff(Seq("B")))
1
oluies

Pysparkでできること

df.select(list(set(df.columns) - set(["B"])))

複数の行を使用することもできます

cols = df.columns
cols.remove("B")
df.select(cols)
1
asmaier

[SPARK-12139] Hiveクエリ用のREGEX列仕様を介して行うことが可能になります。

https://issues.Apache.org/jira/browse/SPARK-12139

0
Tagar