来自列表的数据帧<;字符串>;在爪哇 Spark版本:1.6.2 Java版本:7
我有一个来自列表的数据帧<;字符串>;在爪哇 Spark版本:1.6.2 Java版本:7,java,apache-spark,spark-dataframe,Java,Apache Spark,Spark Dataframe,我有一个列表数据。比如: [[dev, engg, 10000], [karthik, engg, 20000]..] 我知道这个数据的模式 name (String) degree (String) salary (Integer) 我试过: JavaRDD<String> data = new JavaSparkContext(sc).parallelize(datas); DataFrame df = sqlContext.read().json(data); df.pr
列表
数据。比如:
[[dev, engg, 10000], [karthik, engg, 20000]..]
我知道这个数据的模式
name (String)
degree (String)
salary (Integer)
我试过:
JavaRDD<String> data = new JavaSparkContext(sc).parallelize(datas);
DataFrame df = sqlContext.read().json(data);
df.printSchema();
df.show(false);
因为List
不是正确的JSON
我是否需要创建一个合适的JSON,或者是否有其他方法可以做到这一点?在Scala上,任务可以在没有JSON的情况下完成:
val data = List("dev, engg, 10000", "karthik, engg, 20000")
val intialRdd = sparkContext.parallelize(data)
val splittedRDD = intialRdd.map(current => {
val array = current.split(",")
(array(0), array(1), array(2))
})
import sqlContext.implicits._
val dataframe = splittedRDD.toDF("name", "degree", "salary")
dataframe.show()
输出为:
+-------+------+------+
| name|degree|salary|
+-------+------+------+
| dev| engg| 10000|
|karthik| engg| 20000|
+-------+------+------+
注意:(array(0)、array(1)、array(2))是一个Scala元组您可以从
列表
创建数据帧,然后使用selectExpr
和split
获得所需的数据帧
public class SparkSample{
public static void main(String[] args) {
SparkConf conf = new SparkConf().setAppName("SparkSample").setMaster("local[*]");
JavaSparkContext jsc = new JavaSparkContext(conf);
SQLContext sqc = new SQLContext(jsc);
// sample data
List<String> data = new ArrayList<String>();
data.add("dev, engg, 10000");
data.add("karthik, engg, 20000");
// DataFrame
DataFrame df = sqc.createDataset(data, Encoders.STRING()).toDF();
df.printSchema();
df.show();
// Convert
DataFrame df1 = df.selectExpr("split(value, ',')[0] as name", "split(value, ',')[1] as degree","split(value, ',')[2] as salary");
df1.printSchema();
df1.show();
}
}
您提供的示例数据有空格。如果要删除空格并将薪资类型设置为“整数”,则可以使用下面的trim
和cast
函数
df1 = df1.select(trim(col("name")).as("name"),trim(col("degree")).as("degree"),trim(col("salary")).cast("integer").as("salary"));
DataFrame createNGramDataFrame(JavaRDD行){
javarddrows=lines.map(新函数(){
私有静态最终长serialVersionUID=-4332903997027358601L;
@凌驾
公用行调用(字符串行)引发异常{
返回RowFactory.create(line.split(\\s+));
}
});
StructType架构=新StructType(新StructField[]{
新结构域(“单词”,
DataTypes.createArrayType(DataTypes.StringType),false,
Metadata.empty())});
DataFrame wordDF=newsqlcontext(jsc).createDataFrame(行,模式);
//构建二元语言模型
NGram transformer=新NGram().setInputCol(“文字”)
.setOutputCol(“ngrams”).setN(2);
DataFrame ngramDF=transformer.transform(wordDF);
ngramDF.show(10,假);
返回ngramDF;
}
为什么不创建包含这些属性的Java bean类,然后创建ArrayList,然后使用sqlContext.createDataFrame(列表数据,类beanClass)创建dataframe。@abaghel创建Java bean类不可能用于每一组数据。此外,中的教程还介绍了如何手动定义架构,而不是使用不那么可靠的toDF。
root
|-- value: string (nullable = true)
+--------------------+
| value|
+--------------------+
| dev, engg, 10000|
|karthik, engg, 20000|
+--------------------+
root
|-- name: string (nullable = true)
|-- degree: string (nullable = true)
|-- salary: string (nullable = true)
+-------+------+------+
| name|degree|salary|
+-------+------+------+
| dev| engg| 10000|
|karthik| engg| 20000|
+-------+------+------+
df1 = df1.select(trim(col("name")).as("name"),trim(col("degree")).as("degree"),trim(col("salary")).cast("integer").as("salary"));
DataFrame createNGramDataFrame(JavaRDD<String> lines) {
JavaRDD<Row> rows = lines.map(new Function<String, Row>(){
private static final long serialVersionUID = -4332903997027358601L;
@Override
public Row call(String line) throws Exception {
return RowFactory.create(line.split("\\s+"));
}
});
StructType schema = new StructType(new StructField[] {
new StructField("words",
DataTypes.createArrayType(DataTypes.StringType), false,
Metadata.empty()) });
DataFrame wordDF = new SQLContext(jsc).createDataFrame(rows, schema);
// build a bigram language model
NGram transformer = new NGram().setInputCol("words")
.setOutputCol("ngrams").setN(2);
DataFrame ngramDF = transformer.transform(wordDF);
ngramDF.show(10, false);
return ngramDF;
}