有人可以给出一个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
不确定原因,因此寻找一个例子。
答案 0 :(得分:5)
问题在于你使用 Bean Class 。
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;}
}
我们创建了b0
和b1
作为Bean的实例:
Bean b0 = new Bean();
b0.setK("k0");
b0.setSomething("sth0");
Bean b1 = new Bean();
b1.setK("k1");
b1.setSomething("sth1");
此外,我们已将bean(b0
,b1
此处)添加到名为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
的所有引用。