Apache spark 检查摄取Pyspark时的架构

Apache spark 检查摄取Pyspark时的架构,apache-spark,pyspark,apache-spark-sql,Apache Spark,Pyspark,Apache Spark Sql,我有一个经常更改模式的文件 例如,在下文中,发票日期可以采用不同的格式,发票价值可以采用不同的格式(有时使用美元,有时不使用美元,有时使用其他货币) 我希望能够逐列扫描数据帧,并说: -如果发票值列中有非数字字符(a除外),则。。。。然后,我可以定义模式以不同的方式应用于文件 可能吗 对于InvoiceValue您可以使用regexp\u extract。正则表达式并不完美,但你有这个想法 import org.apache.spark.sql.functions._ val data = L

我有一个经常更改模式的文件

例如,在下文中,发票日期可以采用不同的格式,发票价值可以采用不同的格式(有时使用美元,有时不使用美元,有时使用其他货币)

我希望能够逐列扫描数据帧,并说: -如果发票值列中有非数字字符(a除外),则。。。。然后,我可以定义模式以不同的方式应用于文件

可能吗


对于
InvoiceValue
您可以使用
regexp\u 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|
+------------+-------+

勾选下面的代码,这里的发票金额将以浮点数和日期格式为例,您可以根据需要进行更改

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|
+------------+------------+-------------+----+

您的意思是不同类型文件的最终列内容应该是唯一的还是不同的?例如,如果一个文件包含发票值-$5.0,而另一个文件包含6.5,则最后应在发票值列中存储为5和6.5。我的意思是-如果发票值列中有一个$,则我希望将该字段的structtype设置为StringType()。如果没有,我想在读取文件时将其设置为float
inferschema
选项,对您有帮助,不是吗?