Apache spark 检查摄取Pyspark时的架构
我有一个经常更改模式的文件 例如,在下文中,发票日期可以采用不同的格式,发票价值可以采用不同的格式(有时使用美元,有时不使用美元,有时使用其他货币) 我希望能够逐列扫描数据帧,并说: -如果发票值列中有非数字字符(a除外),则。。。。然后,我可以定义模式以不同的方式应用于文件 可能吗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
对于
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
选项,对您有帮助,不是吗?