Databricks-spark-xml не может отфильтровать неверную запись в столбце неверной записи, если отсутствует тег XML и предоставлена ​​схема - PullRequest
3 голосов
/ 26 апреля 2019

Я читаю xml-файл, используя зависимость databricks-spark-xml в scala-spark (intellij). Я предоставляю схему и опцию ("mode", "PERMISSIVE") .option ("columnNameOfCorruptRecord", "_BAD_record") то же имя также присутствует в схеме. Когда spark читает xml-файл, он создает искаженную запись как ноль и не помещает ее в столбец _BAD_record, это приводит к потере данных, которую мое программное обеспечение не может себе позволить. Помогите! Также заранее спасибо ...

не может использовать inferschema, потому что это приведет к несоответствию всех типов данных в виде строки, и все записи будут отклонены для дальнейшей проверки в дальнейшем в конвейере.

Также попытался сгенерировать схему из SchemaConverter из org.zalando.spark.jsonSchema, безуспешно, клиент предпочитает этот метод


    object SecondXmlScalaObject {
        val schema = new StructType().add("AccountOwner", new   StructType().add("Primary", new StructType().add("CISInfo", new StructType().add("CustomerNumber", LongType))
        .add("FirstName", StringType)
        .add("LastName", StringType)
        .add("CurrentAddress", new StructType().add("City", StringType)
        .add("State", StringType)
        .add("Street2", StringType)
        .add("Zip", LongType))))
        .add("BankNumber", StringType)
        .add("DepositAccountNumber", StringType)
        .add("ProductMarketingName", StringType)
        .add("_BAD_RECORDS",StringType)

        def main(args: Array[String]) = {
            val conf = new SparkConf()
                .setAppName("xmlSparkEval")
                .setMaster("local")

            val sc = new SparkContext(conf);

            val spark = SparkSession.builder().getOrCreate()

            val fileContents = Source.fromFile("/resources/jsonschema.json").getLines.mkString

            val schema1 = SchemaConverter.convertContent(fileContents)

            val df = spark.read.format("com.databricks.spark.xml")
                .option("rowTag", "PrintApplication")
                .option("ignoreSurroundingSpaces", true)
                .option("treatEmptyValuesAsNulls", true)
                .option("mode", "PERMISSIVE")
                .option("columnNameOfCorruptRecord", "_BAD_record")
                .schema(schema)
                //.schema(schema1)
                .load("abc.xml")

            df.printSchema()
            df.show(false)
        }
    }

фактические (неприемлемые) результаты: для неправильно сформированной xml-записи все столбцы становятся нулевыми в кадре данных

допустимо: неправильно сформированные (отсутствующие теги) записи должны быть помещены в _BAD_RECORDS

...