web-dev-qa-db-fra.com

Spark-SQL: comment lire un fichier TSV ou CSV dans une trame de données et appliquer un schéma personnalisé?

J'utilise Spark 2.0 tout en travaillant avec des fichiers de valeurs séparées par des tabulations (TSV) et des valeurs séparées par des virgules (CSV). Je souhaite charger les données dans des cadres de données Spark-SQL, où je le ferais aime contrôler complètement le schéma lorsque les fichiers sont lus. Je ne veux pas Spark pour deviner le schéma à partir des données dans le fichier.

Comment charger des fichiers TSV ou CSV dans Spark Dataframes SQL et leur appliquer un schéma?

5

Vous trouverez ci-dessous un exemple complet Spark 2.0 de chargement d'un fichier de valeurs séparées par des tabulations (TSV) et d'application d'un schéma.

J'utilise l'ensemble de données Iris au format TSV de UAH.ed comme exemple. Voici les premières lignes de ce fichier:

Type    PW      PL      SW      SL
0       2       14      33      50
1       24      56      31      67
1       23      51      31      69
0       2       10      36      46
1       20      52      30      65

Pour appliquer un schéma, vous pouvez le créer par programme à l'aide de l'une des deux méthodes suivantes:

A. Créez le schéma avec StructType:

import org.Apache.spark.sql.types._

var irisSchema = StructType(Array(
    StructField("Type",         IntegerType, true),
    StructField("PetalWidth",   IntegerType, true),
    StructField("PetalLength",  IntegerType, true),
    StructField("SepalWidth",   IntegerType, true),
    StructField("SepalLength",  IntegerType, true)
    ))

B. Alternativement, créez le schéma avec un case class Et Encoders (cette approche est moins verbeuse):

import org.Apache.spark.sql.Encoders

case class IrisSchema(Type: Int, PetalWidth: Int, PetalLength: Int, 
                      SepalWidth: Int, SepalLength: Int)

var irisSchema = Encoders.product[IrisSchema].schema

Une fois que vous avez créé votre schéma, vous pouvez utiliser spark.read Pour lire le fichier TSV. Notez que vous pouvez également lire également les fichiers de valeurs séparées par des virgules (CSV) ou tout fichier délimité, tant que vous définissez correctement l'option option("delimiter", d). De plus, si vous avez un fichier de données qui a une ligne d'en-tête, assurez-vous de définir option("header", "true").

Voici le code final complet:

import org.Apache.spark.sql.SparkSession
import org.Apache.spark.sql.Encoders

val spark = SparkSession.builder().getOrCreate()

case class IrisSchema(Type: Int, PetalWidth: Int, PetalLength: Int,
                      SepalWidth: Int, SepalLength: Int)

var irisSchema = Encoders.product[IrisSchema].schema

var irisDf = spark.read.format("csv").     // Use "csv" regardless of TSV or CSV.
                option("header", "true").  // Does the file have a header line?
                option("delimiter", "\t"). // Set delimiter to tab or comma.
                schema(irisSchema).        // Schema that was built above.
                load("iris.tsv")

irisDf.show(5)

Et voici la sortie:

scala> irisDf.show(5)
+----+----------+-----------+----------+-----------+
|Type|PetalWidth|PetalLength|SepalWidth|SepalLength|
+----+----------+-----------+----------+-----------+
|   0|         2|         14|        33|         50|
|   1|        24|         56|        31|         67|
|   1|        23|         51|        31|         69|
|   0|         2|         10|        36|         46|
|   1|        20|         52|        30|         65|
+----+----------+-----------+----------+-----------+
only showing top 5 rows
17