Spark (Scala) Разбор проблемы полей, имеющих формат отметки времени как ("дд-ммм-гг чч: мм: сс: SSSSSSSSS aa") - PullRequest
3 голосов
/ 04 октября 2019

Я хочу проанализировать файл Excel. Этот файл имеет несколько значений полей в качестве формата отметки времени ("dd-MMM-yy hh:mm:ss:SSSSSSSSS aa") Я определил тип поля как отметку времени, но мое приложение не может идентифицировать тип данных и не может загрузить данные, хотя, если я использую StringType в качестве типа данных, он может анализироватьфайл, но я не хочу использовать этот альтернативный подход. Отсюда ищем правильное решение. Мой код выглядит следующим образом:

ReadExcel("C:path\to\the\raw_file\Consignments.xlsx", "A1", MySchema, spark,  "dd-MM-yyyy", "dd-MMM-yy hh:mm:ss:SSSSSSSSS aa")


def ReadExcel(path: String, dataAddress: String = "A2", Schema: StructType, spark: org.apache.spark.sql.SparkSession, datefmt: String = "dd-MM-yyyy", tsfmt: String = "dd-MM-yyyy HH:mm:ss"): DataFrame = {

    /**
     * Though Crealytics accept TimestampFormat Only
     * You can Create CustomSchema with DateType and Date values in data will be typed to Date
     */

    cleanHeaders(spark.read
      .format("com.crealytics.spark.excel")
      .option("dataAddress", dataAddress) //
      .option("useHeader", "false") // Required
      .option("treatEmptyValuesAsNulls", "true") // Optional, default: true
      .option("inferSchema", "false") // Optional, default: false
      .option("addColorColumns", "false") // Optional, default: false
      .option("timestampFormat", "dd-MM-yyyy HH:mm:ss") // Optional, default: yyyy-mm-dd hh:mm:ss[.fffffffff]
      //.option("maxRowsInMemory", 20) // Optional, default None. If set, uses a streaming reader which can help with big files
      //.option("excerptSize", 10) // Optional, default: 10. If set and if schema inferred, number of rows to infer schema from
      .schema(Schema)
      .load(path))
}

Пример данных о дате: 24-SEP-19 07.17.20.873000000 AM Обратите внимание: я использую библиотеку Databricks и библиотеку Crealytics для чтения файла Excel.

1 Ответ

0 голосов
/ 05 октября 2019

@ Венера. Я не думаю, что представление метки времени является правильным. 873000000 миллисекунд при переводе в дни превышают 10 дней. Я думаю, что вам нужно учитывать только первые 3 цифры миллисекунд. пожалуйста, проверьте.

Вы можете придерживаться следующего подхода, если это так:

  1. Сначала прочитайте файл, подстрока, чтобы вырезать первые 3 цифры миллисекунд части столбца метки времени.
  2. Затем используйте литье по искру, в основном, возможно, в методе withColumn , а затем используйте from_unixtime (unix_time (column, 'timestamp format'), 'format')
...