web-dev-qa-db-ja.com

Scala:scalaを使用してDataframesの値を置き換える方法

たとえば、列の0.2に等しいすべての数値を0に置き換えます。Scalaでそれを行うにはどうすればよいですか?ありがとう

編集

|year| make|model| comment            |blank|
|2012|Tesla| S   | No comment         |     | 
|1997| Ford| E350|Go get one now th...|     | 
|2015|Chevy| Volt| null               | null| 

これは、Make列のTeslaをSに変更しようとしている私のデータフレームです

27
Tong

注:Olivier Girardotが言及したように、この回答は最適化されておらず、withColumnソリューションが使用するものです(Azeroth2b回答)

この回答は受け入れられているため削除できません


これについての私の見解は次のとおりです。

 val rdd = sc.parallelize(
      List( (2012,"Tesla","S"), (1997,"Ford","E350"), (2015,"Chevy","Volt"))
  )
  val sqlContext = new SQLContext(sc)

  // this is used to implicitly convert an RDD to a DataFrame.
  import sqlContext.implicits._

  val dataframe = rdd.toDF()

  dataframe.foreach(println)

 dataframe.map(row => {
    val row1 = row.getAs[String](1)
    val make = if (row1.toLowerCase == "tesla") "S" else row1
    Row(row(0),make,row(2))
  }).collect().foreach(println)

//[2012,S,S]
//[1997,Ford,E350]
//[2015,Chevy,Volt]

実際には、mapで直接DataFrameを使用できます。

したがって、基本的に列teslaの列1を確認します。 teslaの場合は、Sに値makeを使用します。それ以外の場合は、列1の現在の値

次に、インデックスを使用して行のすべてのデータでタプルを構築します(ゼロベース)(私の例ではRow(row(0),make,row(2))

おそらくもっと良い方法があります。私はまだSpark傘に精通していません

12
ccheneson

Spark 1.6.2、Javaコード(申し訳ありません)。これにより、RDDを経由せずに、データフレーム全体でTeslaのすべてのインスタンスがSに変更されます。

dataframe.withColumn("make", when(col("make").equalTo("Tesla"), "S")
                             .otherwise(col("make") 
                    );

テスラ以外の列がNULLに変換されないように、「その他」の@ marshall245を追加するように編集されました。

36
Azeroth2b

@ Azeroth2bからソリューションを構築します。いくつかのアイテムのみを交換し、残りは変更しない場合。以下をせよ。 else(...)メソッドを使用しないと、列の残りはnullになります。

import org.Apache.spark.sql.functions._
val newsdf = sdf.withColumn("make", when(col("make") === "Tesla", "S")
                                   .otherwise(col("make"))
                           );

古いデータフレーム

+-----+-----+ 
| make|model| 
+-----+-----+ 
|Tesla|    S| 
| Ford| E350| 
|Chevy| Volt| 
+-----+-----+ 

新しいデータラメ

+-----+-----+
| make|model|
+-----+-----+
|    S|    S|
| Ford| E350|
|Chevy| Volt|
+-----+-----+
23
marshall245

これは、ユーザー定義関数(udf)を使用したデータフレームで実現できます。

import org.Apache.spark.sql.functions._
val sqlcont = new org.Apache.spark.sql.SQLContext(sc)
val df1 = sqlcont.jsonRDD(sc.parallelize(Array(
      """{"year":2012, "make": "Tesla", "model": "S", "comment": "No Comment", "blank": ""}""",
      """{"year":1997, "make": "Ford", "model": "E350", "comment": "Get one", "blank": ""}""",
      """{"year":2015, "make": "Chevy", "model": "Volt", "comment": "", "blank": ""}"""
    )))

val makeSIfTesla = udf {(make: String) => 
  if(make == "Tesla") "S" else make
}
df1.withColumn("make", makeSIfTesla(df1("make"))).show
12
Al M

df2.na.replace( "Name"、Map( "John"-> "Akshay"、 "Cindy"-> "Jayita"))。show()

タイプ[T](col:String、replacement:Map [T、T])org.Apache.spark.sql.DataFrameのクラスDataFrameNaFunctionsのreplace

この機能を実行するには、ヘッダーがオンのアクティブなsparkオブジェクトとデータフレームが必要です。

0
Akshay Pandya