Apache Spark,在Java中使用List<?>作为第一个参数创建DataFrame示例



有人可以举一个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 实例的b0b1

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

此外,我们还将 beans(b0b1这里)添加到一个名为dataList<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));

其中jscJavaSparkContext的实例。

我邀请你看看有很多例子的 Spark 源代码,尤其是在单元测试中,你可以在这里找到 java 中createDataFrame的所有引用。

相关内容

  • 没有找到相关文章

最新更新