Apache spark Spark sql从字符串创建数据集
我有一个字符串,我想从中创建一个数据集,该字符串为Apache spark Spark sql从字符串创建数据集,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我有一个字符串,我想从中创建一个数据集,该字符串为\n行分隔,为\t字段分隔: 8“某物”15236236“2”某物“某物” 因此,我将字符串按\n拆分,并从中创建一个列表,然后使用JavaSparkContext实例创建一个JavaRDD,然后尝试使用sqlContet方法createDataset 这可以很好地编译,如果我在loadDataset()方法的return语句中放置断点,我会看到settingsDatasetdataset,它只在代码调用第一个操作后才会中断 我试图实现这一目标
\n
行分隔,为\t
字段分隔:8“某物”15236236“2”某物“某物”
因此,我将字符串按
\n
拆分,并从中创建一个列表
,然后使用JavaSparkContext实例创建一个JavaRDD,然后尝试使用sqlContet方法createDataset
这可以很好地编译,如果我在loadDataset()方法的return语句中放置断点,我会看到
settingsDataset
dataset,它只在代码调用第一个操作后才会中断
我试图实现这一目标的方式是:
private Dataset<Row> loadDataset(){
InputStream in;
Dataset<Row> settingsDataset = null;
try {
JavaSparkContext jsc = new JavaSparkConte xt(session.sparkContext());
in = getClass().getResourceAsStream("filename.tsv");
String settingsFileAsString = IOUtils.toString(in, Charsets.UTF_8);
List<String> settingsFileAsList = Arrays.asList(settingsFileAsString.split("\n"));
Encoder<Row> encoder = RowEncoder.apply(getSchema());
JavaRDD settingsFileAsRDD = jsc.parallelize(settingsFileAsList);
settingsDataset = session.sqlContext().createDataset(settingsFileAsRDD.rdd(), encoder).toDF();
} catch (Exception e) {
e.printStackTrace();
}
return settingsDataset;
}
private org.apache.spark.sql.types.StructType getSchema() {
return DataTypes.createStructType(new StructField[]{
DataTypes.createStructField("f_1", DataTypes.StringType, true),
DataTypes.createStructField("f_2", DataTypes.StringType, true),
DataTypes.createStructField("f_3", DataTypes.StringType, true),
DataTypes.createStructField("f_4", DataTypes.StringType, true),
DataTypes.createStructField("f_5", DataTypes.StringType, true),
DataTypes.createStructField("f_6", DataTypes.StringType, true)
});
}
私有数据集loadDataset(){
输入流输入;
数据集设置数据集=null;
试一试{
JavaSparkContext jsc=新的JavaSparkContext(session.sparkContext());
in=getClass().getResourceAsStream(“filename.tsv”);
字符串设置FileAsString=IOUtils.toString(in,Charsets.UTF_8);
List settingsFileAsList=Arrays.asList(settingsFileAsString.split(“\n”);
编码器=RowEncoder.apply(getSchema());
JavaRDD setingsfileasrdd=jsc.parallelize(setingsfileaslist);
settingsDataset=session.sqlContext().createDataset(settingsFileAsRDD.rdd(),编码器).toDF();
}捕获(例外e){
e、 printStackTrace();
}
返回设置数据集;
}
private org.apache.spark.sql.types.StructType getSchema(){
返回数据类型。createStructType(新结构字段[]{
DataTypes.createStructField(“f_1”,DataTypes.StringType,true),
DataTypes.createStructField(“f_2”,DataTypes.StringType,true),
DataTypes.createStructField(“f_3”,DataTypes.StringType,true),
DataTypes.createStructField(“f_4”,DataTypes.StringType,true),
DataTypes.createStructField(“f_5”,DataTypes.StringType,true),
DataTypes.createStructField(“f_6”,DataTypes.StringType,true)
});
}
问题是无法创建DAG,代码中断,但出现以下异常:
!java.lang.ClassCastException:java.lang.String不能强制转换为org.apache.spark.sql.Row
在realJavaRDD设置文件ASRDD=jsc.parallelize(设置文件ASLIST)
是JavaRDD
,但它应该是JavaRDD
。您应该按\t
拆分这些“行”,并使用行工厂从中创建新的行。创建(s.split(“\t”)
。见下例:
SparkSession spark = SparkSession.builder().master("local").getOrCreate();
JavaSparkContext jsc = new JavaSparkContext(spark.sparkContext());
String settingsFileAsString = "1\t2\t3\t4\t5\t6\n7\t8\t9\t10\t11\t12";
List<String> settingsFileAsList = Arrays.asList(settingsFileAsString.split("\n"));
Encoder<Row> encoder = RowEncoder.apply(getSchema());
JavaRDD<Row> settingsFileAsRDD = jsc.parallelize(settingsFileAsList).map(s->RowFactory.create(s.split("\t")));
Dataset<Row> settingsDataset = spark.createDataset(settingsFileAsRDD.rdd(), encoder).toDF();
settingsDataset.show();
+---+---+---+---+---+---+
|f_1|f_2|f_3|f_4|f_5|f_6|
+---+---+---+---+---+---+
| 1| 2| 3| 4| 5| 6|
| 7| 8| 9| 10| 11| 12|
+---+---+---+---+---+---+