有人可以举一个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
不知道为什么,因此寻找一个例子。
问题是你使用了Bean Class。
来自JavaBeans维基百科:
JavaBeans是将许多对象封装到单个中的类 对象(豆)。它们是可序列化的,具有零参数 构造函数,并允许使用 getter 和 setter 访问属性 方法。"豆"这个名字是为了包含这个标准,它 旨在为 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;}
}
我们通过以下方式创建了作为 Bean 实例的b0
和b1
:
Bean b0 = new Bean();
b0.setK("k0");
b0.setSomething("sth0");
Bean b1 = new Bean();
b1.setK("k1");
b1.setSomething("sth1");
此外,我们还将 beans(b0
,b1
这里)添加到一个名为data
的List<Bean>
中:
List<Bean> data = new ArrayList<Bean>();
data.add(b0);
data.add(b1);
现在我们可以使用List<Bean>
和Bean
类创建一个DataFrame
:
DataFrame df = sqlContext.createDataFrame(data, Bean.class);
如果我们这样做df.show()
,这是输出:
+---+---------+
| k|something|
+---+---------+
| k0| sth0|
| k1| sth1|
+---+---------+
从 JSON 字符串创建数据帧的更好方法
在 Spark 中,可以直接从 JSON 字符串列表创建DataFrame
:
DataFrame df = sqlContext.read().json(jsc.parallelize(data));
其中jsc
是JavaSparkContext
的实例。
我邀请你看看有很多例子的 Spark 源代码,尤其是在单元测试中,你可以在这里找到 java 中createDataFrame
的所有引用。