如何在java中使用spark Dataframe读取没有列名的文本文件

如何在java中使用spark Dataframe读取没有列名的文本文件,java,apache-spark,apache-spark-sql,Java,Apache Spark,Apache Spark Sql,我正在使用SparkDataFrame读取一个文本文件,每一行由一个空格分隔,如下所示(路径:d:/data/kmeans\u data.txt): 我正在尝试使用DataFrame读取此文本文件: Dataset<Row> dataset = spark.read().text("file:/d:/data/kmeans_data.txt"); Dataset Dataset=spark.read().text(“文件:/d:/data/kmeans_data.txt”); 但

我正在使用
Spark
DataFrame
读取一个文本文件,每一行由一个空格分隔,如下所示(路径:
d:/data/kmeans\u data.txt
):

我正在尝试使用
DataFrame
读取此文本文件:

Dataset<Row> dataset = spark.read().text("file:/d:/data/kmeans_data.txt");
Dataset Dataset=spark.read().text(“文件:/d:/data/kmeans_data.txt”);
但是,它调用一个
IllegalArgumentException

线程“main”java.lang.IllegalArgumentException:字段“features”中不存在异常。 可用字段:值 位于org.apache.spark.sql.types.StructType$$anonfun$apply$1.apply(StructType.scala:267) 位于org.apache.spark.sql.types.StructType$$anonfun$apply$1.apply(StructType.scala:267) 位于scala.collection.MapLike$class.getOrElse(MapLike.scala:128) 位于scala.collection.AbstractMap.getOrElse(Map.scala:59) 位于org.apache.spark.sql.types.StructType.apply(StructType.scala:266) 位于org.apache.spark.ml.util.SchemaUtils$.checkColumnType(SchemaUtils.scala:40) 位于org.apache.spark.ml.clustering.KMeansParams$class.validateAndTransferorMschema(KMeans.scala:93) 位于org.apache.spark.ml.clustering.KMeans.validateAndTransferorMschema(KMeans.scala:254) 位于org.apache.spark.ml.clustering.KMeans.transformSchema(KMeans.scala:340) 位于org.apache.spark.ml.PipelineStage.transformSchema(Pipeline.scala:74) 位于org.apache.spark.ml.clustering.KMeans.fit(KMeans.scala:305) 位于ml.dataframe.clustering.SPKMeans.main(SPKMeans.java:32) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中 位于java.lang.reflect.Method.invoke(Method.java:498) 位于com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)


如何在java中使用spark
DataFrame
读取文本文件?如果没有列名和标签列,我们是否应该创建一个?

根据您的输入数据

您希望将文本文件加载到spark中,因为带有分隔符的CSV文件是一个空格。 您还可以使用选项
header

如下面的示例代码所示

  val conf = new SparkConf().setAppName("learning").setMaster("local[2]")

  val session = SparkSession.builder().config(conf).getOrCreate()
    val schema =  DataTypes.createStructType(Array(
        DataTypes.createStructField("f1",DataTypes.DoubleType,false),
        DataTypes.createStructField("f2",DataTypes.DoubleType,false),
        DataTypes.createStructField("f3",DataTypes.DoubleType,false)
      ))

  val df = session.read
    .format("csv")
    .option("header", false)
    .option("delimiter", " ")
    .schema(schema)
    .load("file:/d:/data/kmeans_data.txt")

我知道该文件可以转换为csv文件。我想知道的是,我是否可以使用
DataFrame
读取无头文本文件?@DuFei是的。你可以。这就是我的答案。
  val conf = new SparkConf().setAppName("learning").setMaster("local[2]")

  val session = SparkSession.builder().config(conf).getOrCreate()
    val schema =  DataTypes.createStructType(Array(
        DataTypes.createStructField("f1",DataTypes.DoubleType,false),
        DataTypes.createStructField("f2",DataTypes.DoubleType,false),
        DataTypes.createStructField("f3",DataTypes.DoubleType,false)
      ))

  val df = session.read
    .format("csv")
    .option("header", false)
    .option("delimiter", " ")
    .schema(schema)
    .load("file:/d:/data/kmeans_data.txt")