2017-06-05 10 views
3

私はCSV入力ファイルを持っています。タイプごとに2つのセットに列を分割する方法は?

これは、データをきちんと読み込み、スキーマを構築します。

次の手順では、列をString列とInteger列に分割します。どうやって?

  • StringCols必要があります。私は2つの変数(StringCols、IntCols)にこれを分割したい

    次は私のデータセットのスキーマであるならば...

    scala> rawdata.printSchema 
    root 
    |-- ID: integer (nullable = true) 
    |-- First Name: string (nullable = true) 
    |-- Last Name: string (nullable = true) 
    |-- Age: integer (nullable = true) 
    |-- DailyRate: integer (nullable = true) 
    |-- Dept: string (nullable = true) 
    |-- DistanceFromHome: integer (nullable = true) 
    

  • IntColsには、「ID」、「年齢」、「DailyRate」、「DistanceFromHome」が含まれている必要があります。
  • 「姓」「姓」「部」

これは私が試したものです:

val names = rawdata.schema.fieldNames 
val types = rawdata.schema.fields.map(r => r.dataType) 

を今typesに、私がループしたいと、すべてのStringTypeを見つけると同様にIntegerTypeのために、列名の名前にアップルックアップするでしょう。

答えて

3

ここであなたが基礎となるschemadataType

import org.apache.spark.sql.types.{IntegerType, StringType} 

val stringCols = df.schema.filter(c => c.dataType == StringType).map(_.name) 
val intCols = df.schema.filter(c => c.dataType == IntegerType).map(_.name) 

val dfOfString = df.select(stringCols.head, stringCols.tail : _*) 
val dfOfInt = df.select(intCols.head, intCols.tail : _*) 
+1

私が見ていたことはありがとうございました。私がした間違いは、sql.typesを含まないことでした。{IntegerType、StringType} Iは以下となって空のリストをしていた ヴァルTST = rawdata.schema.filter(C => c.dataType == "StringType")代わり のヴァルTST = rawdata.schema.filter (c => c.dataType == StringType) ありがとうございます。 よろしくお願いいたします。 バラ –

0

使用dtypesオペレータ使用のタイプによってあなたの列をフィルタリングすることができ、行く:

dtypes:配列[(文字列、文字列)]すべての列名とそのデータ型を配列として返します。

これは、データセットのスキーマをより慣れ親しんで扱う方法を提供します。私は2つの変数(StringCols、IntCols)

(あなたが気にしないならば、私はむしろ代わりに不変の値を使用してに固執するだろう)

val emptyPair = (Seq.empty[String], Seq.empty[String]) 
val (stringCols, intCols) = rawdata.dtypes.foldLeft(emptyPair) { case ((strings, ints), (name: String, typ)) => 
    typ match { 
    case _ if typ == "StringType" => (name +: strings, ints) 
    case _ if typ == "IntegerType" => (strings, name +: ints) 
    } 
} 
にこれを分割したい

val rawdata = Seq(
    (1, "First Name", "Last Name", 43, 2000, "Dept", 0) 
).toDF("ID", "First Name", "Last Name", "Age", "DailyRate", "Dept", "DistanceFromHome") 
scala> rawdata.dtypes.foreach(println) 
(ID,IntegerType) 
(First Name,StringType) 
(Last Name,StringType) 
(Age,IntegerType) 
(DailyRate,IntegerType) 
(Dept,StringType) 
(DistanceFromHome,IntegerType) 

StringColsには、「姓」、「姓」、「部署」、「IntCols」に「ID」、「年齢」、「DailyRate」、「DistanceFromHome」

あなたはコレクションを作成することはできますが、私はむしろパフォーマンスが高価で、何も返さないようにしたいと思います。

関連する問題