2017-09-27 21 views
0

私のsparkアプリケーションはcsvファイルを読み込み、sqlを使用して別のフォーマットに変換し、結果のデータフレームを別のcsvファイルに書き込みます。次のようにcsvカラムのnull値をnullデータ型として処理するスパーク

例えば、私は、入力CSVを持っている:

Id|FirstName|LastName|LocationId 
1|John|Doe|123 
2|Alex|Doe|234 

私の変換は、次のとおりです。

Select Id, 
     FirstName, 
     LastName, 
     LocationId as PrimaryLocationId, 
     null as SecondaryLocationId 
from Input 

ヌルがSecondaryLocationIdとして使用されている理由を、私は答えることができない(それがビジネスであります使用例) sparkがSecondaryLocationIdのデータ型を認識できず、スキーマにnullを返してエラーをスローするCSVデータソースはnullデータ型を出力CSVに書き込んでいる間はサポートしていません。

以下は、使用しているprintSchema()と書き込みオプションです。

root 
    |-- Id: string (nullable = true) 
    |-- FirstName: string (nullable = true) 
    |-- LastName: string (nullable = true) 
    |-- PrimaryLocationId: string (nullable = false) 
    |-- SecondaryLocationId: null (nullable = true) 

dataFrame.repartition(1).write 
     .mode(SaveMode.Overwrite) 
     .option("header", "true") 
     .option("delimiter", "|") 
     .option("nullValue", "") 
     .option("inferSchema", "true") 
     .csv(outputPath) 

デフォルトのデータ型(文字列など)には方法がありますか? ところで、ヌルを空の文字列( '')に置き換えて、これを動作させることができますが、これは私がしたいことではありません。

答えて

0

使用点灯(ヌル):インポートorg.apache.spark.sql.functions {点灯、UDF}

例:

import org.apache.spark.sql.functions.{lit, udf} 

case class Record(foo: Int, bar: String) 
val df = Seq(Record(1, "foo"), Record(2, "bar")).toDF 

val dfWithFoobar = df.withColumn("foobar", lit(null: String)) 


scala> dfWithFoobar.printSchema 
root 
|-- foo: integer (nullable = false) 
|-- bar: string (nullable = true) 
|-- foobar: null (nullable = true) 
and it is not retained by the csv writer. If it is a hard requirement you 
can cast column to the specific type (lets say String): 

import org.apache.spark.sql.types.StringType 
df.withColumn("foobar", lit(null).cast(StringType)) 

または使用のようなUDF:

val getNull = udf(() => None: Option[String]) // Or some other type 

df.withColumn("foobar", getNull()).printSchema 

root 
|-- foo: integer (nullable = false) 
|-- bar: string (nullable = true) 
|-- foobar: string (nullable = true) 

zero323コードを再投稿。

今すぐあなたの2番目の質問について話し合うことができます

質問:

「私は多数のファイルが読み込まれ、様々な適用されている場合は、列がnullとしてデータ型を扱われるかを知るときのみです。変換には、私は私がnullに処理されているフィールドを知っている可能性がある方法を知っているか、存在しないだろう」

答え:?

この場合、オプションを使用できます

Databricks Scala style guideは、スカラーコードから常にnullを禁止し、「パフォーマンスに影響を与えるコードについては、仮想メソッド呼び出しを避けるためにOptionよりもnullを優先します。ボクシング「

例:。

+------+ 
|number| 
+------+ 
|  1| 
|  8| 
| 12| 
| null| 
+------+ 


val actualDf = sourceDf.withColumn(
    "is_even", 
    when(
    col("number").isNotNull, 
    isEvenSimpleUdf(col("number")) 
).otherwise(lit(null)) 
) 

actualDf.show() 
+------+-------+ 
|number|is_even| 
+------+-------+ 
|  1| false| 
|  8| true| 
| 12| true| 
| null| null| 
+------+-------+ 
+0

これは、どの列がNULLデータ型として扱われるかを知っているときのみです。多数のファイルが読み込まれていて、さまざまな変換が適用されると、私は知らないでしょうか、またはどのフィールドがnullであるかを知る方法がありますか? – tturner

関連する問題