如何从整数 RDD 创建火花数据帧

Posted

技术标签:

【中文标题】如何从整数 RDD 创建火花数据帧【英文标题】:How to create a a spark dataframe from Integer RDD 【发布时间】:2016-03-28 07:34:48 【问题描述】:

如何从包含整数的JavaRDD 创建DataFrame。我做了类似下面的事情但没有工作。

List<Integer> input = Arrays.asList(101, 103, 105);
JavaRDD<Integer> inputRDD = sc.parallelize(input);
DataFrame dataframe = sqlcontext.createDataFrame(inputRDD, Integer.class);

我得到ClassCastExceptionorg.apache.spark.sql.types.IntegerType$ cannot be cast to org.apache.spark.sql.types.StructType

我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:

显然(虽然不直观),这个createDataFrame 重载只能用于“Bean”类型,这意味着类型不对应于任何内置的 Spark SQL 类型

可以看到,在源码中,你传递的类与JavaTypeInference.inferDataType中的一个Spark SQL类型匹配,结果被强制转换为StructType(见SQLContext.getSchema中的dataType.asInstanceOf[StructType]——但是内置的“原始”类型(如 IntegerTypeNOT StructTypes... 对我来说似乎是一个错误或未记录的行为......

解决方法

    用“bean”类包装你的Integers(我知道这很难看):

    public static class MyBean 
        final int value;
    
        MyBean(int value) 
            this.value = value;
        
    
        public int getValue() 
            return value;
        
    
    
    List<MyBean> input = Arrays.asList(new MyBean(101), new MyBean(103), new MyBean(105));
    JavaRDD<MyBean> inputRDD = sc.parallelize(input);
    DataFrame dataframe = sqlcontext.createDataFrame(inputRDD, MyBean.class);
    
    dataframe.show(); // this works...
    

    自己转换为RDD&lt;Row&gt;

    // convert to Rows:
    JavaRDD<Row> rowRdd = inputRDD.map(new Function<Integer, Row>() 
        @Override
        public Row call(Integer v1) throws Exception 
            return RowFactory.create(v1);
        
    );
    
    // create schema (this looks nicer in Scala...):
    StructType schema = new StructType(new StructField[]new StructField("number", IntegerType$.MODULE$, false, Metadata.empty()));
    
    DataFrame dataframe = sqlcontext.createDataFrame(rowRdd, schema);
    dataframe.show(); // this works...
    

【讨论】:

【参考方案2】:

现在在 Spark 2.2 中,您可以执行以下操作来创建数据集。

Dataset<Integer> dataSet = sqlContext().createDataset(javardd.rdd(), Encoders.INT());

【讨论】:

以上是关于如何从整数 RDD 创建火花数据帧的主要内容,如果未能解决你的问题,请参考以下文章

如何在火花中将rdd对象转换为数据框

如何在火花上将json字符串转换为数据帧

如何将数据块中的数据从熊猫数据帧加载到火花数据帧

如何使用火花流检查 rdd 是不是为空?

Pyspark:从列表的 RDD 创建一个火花数据框,其中列表的某些元素是对象

如何将火花数据帧数组转换为元组