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

sc *_* so 4 java apache-spark apache-spark-sql

有人可以给出public DataFrame createDataFrame(java.util.List<?> data,java.lang.Class<?> beanClass) Spark JavaDoc中提到的Java 函数实现示例 吗?

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

java.lang.ClassCastException: org.apache.spark.sql.types.StringType$ cannot be cast to org.apache.spark.sql.types.StructType
Run Code Online (Sandbox Code Playgroud)

不知道为什么,因此寻找一个例子。

Yua*_* JI 7

问题是您使用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;}
}
Run Code Online (Sandbox Code Playgroud)

我们已经创造了b0b1那些Bean的实例是:

Bean b0 = new Bean();
b0.setK("k0");
b0.setSomething("sth0");
Bean b1 = new Bean();
b1.setK("k1");
b1.setSomething("sth1");
Run Code Online (Sandbox Code Playgroud)

另外,我们已经将bean(b0b1here)添加到一个List<Bean>被调用的对象中data

List<Bean> data = new ArrayList<Bean>();
data.add(b0);
data.add(b1);
Run Code Online (Sandbox Code Playgroud)

现在我们可以创建一个DataFrameusing List<Bean>Beanclass:

DataFrame df = sqlContext.createDataFrame(data, Bean.class);
Run Code Online (Sandbox Code Playgroud)

如果这样做df.show(),则输出如下:

+---+---------+
|  k|something|
+---+---------+
| k0|     sth0|
| k1|     sth1|
+---+---------+
Run Code Online (Sandbox Code Playgroud)

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

在Spark中,您可以直接DataFrame从JSON字符串列表创建:

DataFrame df = sqlContext.read().json(jsc.parallelize(data));
Run Code Online (Sandbox Code Playgroud)

jsc的实例在哪里JavaSparkContext


Ben*_*det -1

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