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

在real
JavaRDD设置文件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|
+---+---+---+---+---+---+