2017-05-02 2 views
1

Mes données est comme ceci:Comment lire le fichier json pour déclencher une trame de données sans que ces données aient une valeur nulle dans une colonne?

{"id":"1","time":123,"sth":100} 
{"id":"2","sth":456} 
{"id":"3","time":789,"sth":300} 

Et j'écris mon schéma comme:

StructType(
    Array(
    StructField("id", StringType, false), 
    StructField("time", StringType, false), 
    StructField("sth", StringType, true), 
) 
) 

Et je lis mes données à l'aide:

val df = spark.read.schema(buildSchema()).json(path) 

Ce que je veux que mon dataframe ne lit pas ces lignes sans la valeur "time", donc le résultat que je veux est

| id | temps | sth |
| 1 | 123 | 100 |
| 3 | 789 | 300 | Cependant, même si j'ai défini l'attribut nullable comme faux dans mon StructField, il lit toujours la deuxième ligne {"id":"2","sth":456} dans ma table, et j'ai besoin de perdre du temps pour laisser tomber ces lignes avec une valeur nulle après lecture. Y a-t-il un moyen de faire ce que je veux efficacement?

+0

double possible de [DataFrameReadercsv (path: String) option pour la sauter des lignes vides] (http://stackoverflow.com/questions/43476254/dataframereadercsvpath-string-option- for-skipping-blank-lines) – mtoto

Répondre

4

Vous pouvez essayer,

val otherPeopleRDD = spark.sparkContext.makeRDD(
      """[{"id":"1","time":123,"sth":100} , 
     {"id":"2","sth":456} , 
     {"id":"3","time":789,"sth":300} ] """ :: Nil) 


     val otherPeople = spark.read.json(otherPeopleRDD).na.drop() 
     otherPeople.show() 


+---+---+----+ 
| id|sth|time| 
+---+---+----+ 
| 1|100| 123| 
| 3|300| 789| 
+---+---+----+