创建DataFrame遇到的问题

来源:互联网 发布:js让多个功能延迟执行 编辑:程序博客网 时间:2024/05/21 00:44

sparkSQL的createDataFrame提供了多种重载方法,我使用了这两个:

createDataFrame(java.util.List<Row> rows, StructType schema) createDataFrame(JavaRDD<?> rdd, java.lang.Class<?> beanClass) 

对于构造好的RDD:

val schemaString = "id name"val schema = StructType(schemaString.split(" ").map(fieldName => StructField(fieldName, StringType, true)))val rowRDD = lines.filter(_.length > 1).map(_.split(" ")).map(p => Row(p(0), p(1)))val dfCustomers = sqlContext.createDataFrame(rowRDD, schema)val df= dfCustomers.toDF()df.write.mode(SaveMode.Append).parquet("data.parquet")

这个比较简单,主要是schema的格式按照官网定义就可以。
对于传多行数据,如果顺序不固定的话,按照这个方法可能会出现错乱的问题,比如lines里边一行数据的顺序是id name 另一行是 name id的话处理好了之后两行数据就出问题了。鉴于此可以采用javabean的方式,定义javabean文件:

import java.io.Serializable;public class JavaBean implements Serializable {    private static final long serialVersionUID = 1L;    private String id= "";    public String getId() {        return id;    }    public void setId(String id) {        this.id = id;    }    public void yourCommonMethod(){        //定义你自己的逻辑,保证数据正确处理    }

由于对javabean文件应该有的格式理解的不是很透彻,导致遇到一些问题,有几点:
1.Serializable 接口
2.属性,getter,setter方法一定要有
3.自定义的方法不要是get和set开头
scala 定义的方式:

import scala.beans.BeanPropertyclass ScalaBean {  @BeanProperty var id:String = null  def yourCommonMethod():Unit={      //定义你自己的逻辑,保证数据正确处理  }

保证自定义方法不要有get和set开头
如果bean文件出现问题,会在主函数调用的

val df =  sqlContext.createDataFrame(javaRdd,new ScalaBean().getClass)

这句出现

Exception in thread "main" java.lang.NullPointerException    at org.spark-project.guava.reflect.TypeToken.method(TypeToken.java:465)    at org.apache.spark.sql.catalyst.JavaTypeInference$$anonfun$2.apply(JavaTypeInference.scala:110)at org.apache.spark.sql.catalyst.JavaTypeInference$$anonfun$2.apply(JavaTypeInference.scala:109)    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)    at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)    at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:108)    at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)    at scala.collection.mutable.ArrayOps$ofRef.map(ArrayOps.scala:108)    at org.apache.spark.sql.catalyst.JavaTypeInference$.org$apache$spark$sql$catalyst$JavaTypeInference$$inferDataType(JavaTypeInference.scala:109)    at org.apache.spark.sql.catalyst.JavaTypeInference$.inferDataType(JavaTypeInference.scala:54)    at org.apache.spark.sql.SQLContext.getSchema(SQLContext.scala:941)    at org.apache.spark.sql.SQLContext.createDataFrame(SQLContext.scala:572)    at com.ys.SparkDemo0$.main(Test.scala:110)    at com.ys.SparkDemo0.main(Test.scala)    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)    at java.lang.reflect.Method.invoke(Method.java:498)    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)16/11/24 17:37:26 INFO SparkContext: Invoking stop() from shutdown hook

搞得措手不及。

0 0