【问题标题】:How to create a Dataframe from a String?如何从字符串创建数据框?
【发布时间】:2017-05-17 15:09:09
【问题描述】:

我有一个如下所示的字符串,每行由新行分隔,字段用空格分隔。第一行是我的标题。

col1 col2 col3 col4 col5 col6 col7 col8
val1 val2 val3 val4 val5 val6 val7 val8
val9 val10 val11 val12 val13 val14 val15 val16
val17 val18 val19 val20 val21 val22 val23 val24

如何在 Java 中从 String 构建 Spark DataFrame

【问题讨论】:

    标签: apache-spark spark-dataframe


    【解决方案1】:

    我相信@Shankar Koirala 已经通过将文本/字符串文件视为 CSV 文件(使用自定义分隔符 " " 而不是 ",")在 Java 中提供了解决方案。下面是相同方法的 Scala 等价物:

    val spark = org.apache.spark.sql.SparkSession.builder.
      master("local").
      appName("Spark custom CSV").
      getOrCreate
    
    val df = spark.read.
      format("csv").
      option("header", "true").
      option("delimiter", " ").
      csv("/path/to/textfile")
    
    df.show
    +-----+-----+-----+-----+-----+-----+-----+-----+
    | col1| col2| col3| col4| col5| col6| col7| col8|
    +-----+-----+-----+-----+-----+-----+-----+-----+
    | val1| val2| val3| val4| val5| val6| val7| val8|
    | val9|val10|val11|val12|val13|val14|val15|val16|
    |val17|val18|val19|val20|val21|val22|val23|val24|
    +-----+-----+-----+-----+-----+-----+-----+-----+
    

    [更新] 从字符串内容创建 DataFrame

    val s: String = """col1 col2 col3 col4 col5 col6 col7 col8
                      |val1 val2 val3 val4 val5 val6 val7 val8
                      |val9 val10 val11 val12 val13 val14 val15 val16
                      |val17 val18 val19 val20 val21 val22 val23 val24
    |"""
    
    // remove header line
    val s2 = s.substring(s.indexOf('\n') + 1)
    
    // create RDD
    val rdd = sc.parallelize( s2.split("\n").map(_.split(" ")) )
    
    // create DataFrame
    val df = rdd.map{ case Array(c1, c2, c3, c4, c5, c6, c7, c8) => (c1, c2, c3, c4, c5, c6, c7, c8) }.
      toDF("col1", "col2", "col3", "col4", "col5", "col6", "col7", "col8")
    
    df.show
    +-----+-----+-----+-----+-----+-----+-----+-----+
    | col1| col2| col3| col4| col5| col6| col7| col8|
    +-----+-----+-----+-----+-----+-----+-----+-----+
    | val1| val2| val3| val4| val5| val6| val7| val8|
    | val9|val10|val11|val12|val13|val14|val15|val16|
    |val17|val18|val19|val20|val21|val22|val23|val24|
    +-----+-----+-----+-----+-----+-----+-----+-----+
    

    【讨论】:

    • 是的@Shankar,您正在提供从 csv 文件中读取的解决方案。我所拥有的是从特定文件中提取的字符串。我不想将我拥有的字符串写回 csv 文件并再次读取它。如何将我拥有的字符串转换为数据框?
    • 啊,我的疏忽。请查看扩展答案(不过,代码在 Scala 中)。
    • 你能帮我处理这段java代码吗? sc.parallelize(s2.split("\n").map(_.split("")))
    • 在 Java 中处理字符串的一种方法类似于this
    【解决方案2】:

    您可以在 spark Java API 中读取 csv 文件,如下所示: 创建火花会话

    SparkSession spark = SparkSession.builder()
      .master("local[*]")
      .appName("Example")
      .getOrCreate();
    
    //read file with header true and delimiter as " " (space)
    DataFrame df = spark.read
        .option("delimiter", " ")
        .option("header", true)
        .csv("path to file");
    df.show();
    

    【讨论】:

    • 它不是一个 csv 文件,它是一个字符串。
    猜你喜欢
    • 2016-10-14
    • 2021-08-18
    • 2018-11-03
    • 1970-01-01
    • 2018-05-27
    • 2021-12-24
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    相关资源
    最近更新 更多