【问题标题】:How can I directly load a xml string to a dataset? Instead of loading from a xml file?如何直接将 xml 字符串加载到数据集?而不是从 xml 文件加载?
【发布时间】:2020-01-07 04:12:51
【问题描述】:

我需要一种将 XML 字符串直接放入数据集的方法。而不是从文件中加载它。

SparkSession spark = SparkSession.builder().master("local").getOrCreate();

Dataset<Row> df = spark.read().format("com.databricks.spark.xml")
            .option("rowTag", "book").load("books.xml");

df.show();

这适用于简单地从文件中调用 xml。有没有办法直接将 xml 字符串输入到数据集?例如,使用字符串 xmlString,如下所示。

String xmlString = "<persons>
    <person id="1">
        <firstname>James</firstname>
        <lastname>Smith</lastname>
        <middlename></middlename>
        <dob_year>1980</dob_year>
        <dob_month>1</dob_month>
        <gender>M</gender>
        <salary currency="Euro">10000</salary>
    </person>
</persons>";

问题是我不想使用文件。我只想使用字符串。我知道有一种方法可以将字符串保存到 xml 文件中,然后使用新创建的 xml 文件。但除此之外还有什么办法吗?

【问题讨论】:

    标签: xml dataframe apache-spark dataset load


    【解决方案1】:

    您可以使用已弃用的xmlRdd(这是唯一的解决方案,我现在可以看到)

     public static void readFromString() {
        SparkConf sparkConf = new SparkConf().setAppName("Print Elements of RDD")
                .setMaster("local[2]").set("spark.executor.memory","2g");
    
        JavaSparkContext sc = new JavaSparkContext(sparkConf);
    
        String books = "<persons>\n" +
                "    <person id=\"1\">\n" +
                "        <firstname>James</firstname>\n" +
                "        <lastname>Smith</lastname>\n" +
                "        <middlename></middlename>\n" +
                "        <dob_year>1980</dob_year>\n" +
                "        <dob_month>1</dob_month>\n" +
                "        <gender>M</gender>\n" +
                "        <salary currency=\"Euro\">10000</salary>\n" +
                "    </person>\n" +
                "</persons>";
    
        List<String> booksList = Arrays.asList(books);
    
        RDD<String> booksRDD = sc.parallelize(booksList, 1).rdd();
    
        Dataset<Row> rowDataset = new XmlReader().withRowTag("person").xmlRdd(new SQLContext(sc), booksRDD);
    
        rowDataset.printSchema();
    
        rowDataset.select("person.*").show();
    
    }
    

    rowDataset.printSchema() 的结果:

    root
     |-- person: struct (nullable = true)
     |    |-- _id: long (nullable = true)
     |    |-- dob_month: long (nullable = true)
     |    |-- dob_year: long (nullable = true)
     |    |-- firstname: string (nullable = true)
     |    |-- gender: string (nullable = true)
     |    |-- lastname: string (nullable = true)
     |    |-- middlename: string (nullable = true)
     |    |-- salary: struct (nullable = true)
     |    |    |-- _VALUE: long (nullable = true)
     |    |    |-- _currency: string (nullable = true)
    

    rowDataset.select("person.*").show();的结果

    +---+---------+--------+---------+------+--------+----------+------------+
    |_id|dob_month|dob_year|firstname|gender|lastname|middlename|      salary|
    +---+---------+--------+---------+------+--------+----------+------------+
    |  1|        1|    1980|    James|     M|   Smith|          |[10000,Euro]|
    +---+---------+--------+---------+------+--------+----------+------------+
    

    我希望这会有所帮助!

    【讨论】:

    • 是的,这有效!但是有没有一种方法可以显示()不止一行?就像我在那里添加另一个人一样,rowDataset.select("person.*").show(); 会引发错误..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 2018-06-24
    • 2012-09-22
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多