如何从整数 RDD 创建火花数据帧
Posted
技术标签:
【中文标题】如何从整数 RDD 创建火花数据帧【英文标题】:How to create a a spark dataframe from Integer RDD 【发布时间】:2016-03-28 07:34:48 【问题描述】:如何从包含整数的JavaRDD
创建DataFrame
。我做了类似下面的事情但没有工作。
List<Integer> input = Arrays.asList(101, 103, 105);
JavaRDD<Integer> inputRDD = sc.parallelize(input);
DataFrame dataframe = sqlcontext.createDataFrame(inputRDD, Integer.class);
我得到ClassCastException
说org.apache.spark.sql.types.IntegerType$ cannot be cast to org.apache.spark.sql.types.StructType
我怎样才能做到这一点?
【问题讨论】:
【参考方案1】:显然(虽然不直观),这个createDataFrame
重载只能用于“Bean”类型,这意味着类型不对应于任何内置的 Spark SQL 类型。
可以看到,在源码中,你传递的类与JavaTypeInference.inferDataType
中的一个Spark SQL类型匹配,结果被强制转换为StructType
(见SQLContext.getSchema
中的dataType.asInstanceOf[StructType]
——但是内置的“原始”类型(如 IntegerType
)NOT StructType
s... 对我来说似乎是一个错误或未记录的行为......
解决方法:
用“bean”类包装你的Integer
s(我知道这很难看):
public static class MyBean
final int value;
MyBean(int value)
this.value = value;
public int getValue()
return value;
List<MyBean> input = Arrays.asList(new MyBean(101), new MyBean(103), new MyBean(105));
JavaRDD<MyBean> inputRDD = sc.parallelize(input);
DataFrame dataframe = sqlcontext.createDataFrame(inputRDD, MyBean.class);
dataframe.show(); // this works...
自己转换为RDD<Row>
:
// convert to Rows:
JavaRDD<Row> rowRdd = inputRDD.map(new Function<Integer, Row>()
@Override
public Row call(Integer v1) throws Exception
return RowFactory.create(v1);
);
// create schema (this looks nicer in Scala...):
StructType schema = new StructType(new StructField[]new StructField("number", IntegerType$.MODULE$, false, Metadata.empty()));
DataFrame dataframe = sqlcontext.createDataFrame(rowRdd, schema);
dataframe.show(); // this works...
【讨论】:
【参考方案2】:现在在 Spark 2.2 中,您可以执行以下操作来创建数据集。
Dataset<Integer> dataSet = sqlContext().createDataset(javardd.rdd(), Encoders.INT());
【讨论】:
以上是关于如何从整数 RDD 创建火花数据帧的主要内容,如果未能解决你的问题,请参考以下文章