Apache Spark,Java中的createDataFrame示例使用List <! - ? - >作为第一个参数

时间:2016-06-24 21:19:20

标签: java apache-spark apache-spark-sql

有人可以给出一个java实现的例子 public DataFrame createDataFrame(java.util.List<?> data,java.lang.Class<?> beanClass) 函数,如Spark JavaDoc中提到的那样?

我有一个JSON字符串列表,我作为第一个参数传递,因此我传递String.class作为第二个参数,但是它给出了一个错误

java.lang.ClassCastException: org.apache.spark.sql.types.StringType$ cannot be cast to org.apache.spark.sql.types.StructType

不确定原因,因此寻找一个例子。

2 个答案:

答案 0 :(得分:5)

问题在于你使用 Bean Class

来自JavaBeans Wikipedia

  

JavaBeans是将许多对象封装到一个对象中的类   对象(bean)。它们是可序列化的,具有零参数   构造函数,并允许使用getter和setter访问属性   方法。 “Bean”这个名称包含了这个标准   旨在为Java创建可重用的软件组件。

为了更清楚,让我举一个使用Spark中的Java Bean的例子:

假设我们使用这个Bean类:

import java.io.Serializable;

public class Bean implements Serializable {
    private static final long serialVersionUID = 1L;

    private String k;
    private String something;

    public String getK() {return k;}
    public String getSomething() {return something;}

    public void setK(String k) {this.k = k;}
    public void setSomething(String something) {this.something = something;}
}

我们创建了b0b1作为Bean的实例:

Bean b0 = new Bean();
b0.setK("k0");
b0.setSomething("sth0");
Bean b1 = new Bean();
b1.setK("k1");
b1.setSomething("sth1");

此外,我们已将bean(b0b1此处)添加到名为List<Bean>的{​​{1}}中:

data

现在我们可以使用List<Bean> data = new ArrayList<Bean>(); data.add(b0); data.add(b1); DataFrame类创建List<Bean>

Bean

如果我们DataFrame df = sqlContext.createDataFrame(data, Bean.class); ,则输出结果为:

df.show()

从JSON STRING创建数据框架的更好方法

在Spark中,您可以直接从JSON字符串列表中创建+---+---------+ | k|something| +---+---------+ | k0| sth0| | k1| sth1| +---+---------+

DataFrame

其中DataFrame df = sqlContext.read().json(jsc.parallelize(data)); jsc的实例。

答案 1 :(得分:-2)

我邀请您查看火花源代码,其中有大量示例,特别是在单元测试中,您可以在java here中找到createDataFrame的所有引用。