Проверка схемы при загрузке Pyspark - PullRequest
0 голосов
/ 27 мая 2020

У меня есть файл, который довольно часто меняет схему.

Например, ниже, дата счета может иметь разные форматы, а стоимость счета может иметь другой формат (иногда с $, иногда без и иногда с другой валютой).

Я хочу иметь возможность сканировать столбец фрейма данных по столбцу и сказать: - Если в столбце стоимости счета-фактуры есть нечисловой символ c (кроме a.), тогда .... Затем я могу определить схему для применения к файлу по-другому.

Возможно ли это?

enter image description here

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Проверьте код ниже, здесь стоимость счета будет представлять собой плавающее число и формат даты, например, вы можете изменить его в соответствии с требованиями.

from pyspark.sql.functions import *
from pyspark.sql.functions import expr
import pyspark.sql.functions as f

df = sc.parallelize([["ThoughtStorm","11/23/2019","$6.09","true"],
["Talane","3/28/2019","£7.20","true"]]).toDF(("company_name","invoice_date","invoice_value","paid"))
df = df.withColumn("invoice_value",regexp_extract(col("invoice_value"), """([0-9]*[.])?[0-9]+""", 0))
df = df.withColumn("invoice_date", f.date_format(f.to_date(f.unix_timestamp(col("invoice_date"), "mm/dd/yyyy").cast("timestamp")), 'yyyy-MM-dd'))
df.show()
+------------+------------+-------------+----+
|company_name|invoice_date|invoice_value|paid|
+------------+------------+-------------+----+
|ThoughtStorm|  2019-01-23|         6.09|true|
|      Talane|  2019-01-28|         7.20|true|
+------------+------------+-------------+----+
1 голос
/ 28 мая 2020

для InvoiceValue вы можете использовать regexp_extract. Регулярное выражение не идеально, но вы поняли идею.

import org.apache.spark.sql.functions._

val data = List(
  ("$50.60"),
  ("$5.60"),
  ("£500.400"),
  ("100"),
  ("100.20")
).toDF("InvoiceValue")

data.show

val newdata = data.withColumn("value", regexp_extract($"InvoiceValue","""\D*(\d{1,4}\.{1}\d{1,4}).*""", 1))
newdata.show

вывод

data: org.apache.spark.sql.DataFrame = [InvoiceValue: string]
+------------+
|InvoiceValue|
+------------+
|      $50.60|
|       $5.60|
|    £500.400|
|         100|
|      100.20|
+------------+

newdata: org.apache.spark.sql.DataFrame = [InvoiceValue: string, value: string]
+------------+-------+
|InvoiceValue|  value|
+------------+-------+
|      $50.60|  50.60|
|       $5.60|   5.60|
|    £500.400|500.400|
|         100|    100|
|      100.20| 100.20|
+------------+-------+
...