我有一个文本文件,其记录如下:
// The string to analyze
const str = 'I am a super cool monkey man'
// The word to find
const word = 'cool'
// The result
console.log(str.slice(str.indexOf(word)))
我正在尝试将其读入spark并处理文件,以使结果为:
<BR>Datetime:2018.06.30^
Name:ABC^
Se:4^
Machine:XXXXXXX^
InnerTrace:^
AdditionalInfo:^
<ER>
<BR>Datetime:2018.05.30-EDT^
Name:DEF^
Se:4^
Machine:XXXXXXX^
InnerTrace:^
AdditionalInfo:^
<ER>
当我尝试使用
将文件读入sparkDatetime Name Se Machine InnerTrace AdditionalInfo
2018.06.30 ABC 4 XXXXXXX
2018.05.30 DEF 4 XXXXXXX
我将每一行分开存放,这使得将
和
我正在使用PySpark 2进行此操作。
答案 0 :(得分:2)
这种文件格式不是火花友好的。如果您无法修改文件,则必须进行大量处理才能以所需的方式获取文件。
这是一种可能对您有用的方法-
假设您具有以下DataFrame:
df = spark.read.csv(path="filename", quote='')
df.show(truncate=False)
#+-----------------------------+
#|_c0 |
#+-----------------------------+
#|"<BR>Datetime:2018.06.30^ |
#|Name:ABC^ |
#|Se:4^ |
#|Machine:XXXXXXX^ |
#|InnerTrace:^ |
#|AdditionalInfo:^ |
#|<ER>" |
#|"<BR>Datetime:2018.05.30-EDT^|
#|Name:DEF^ |
#|Se:4^ |
#|Machine:XXXXXXX^ |
#|InnerTrace:^ |
#|AdditionalInfo:^ |
#|<ER>" |
#+-----------------------------+
import pyspark.sql.functions as f
from pyspark.sql import Window
w = Window.orderBy("id").rangeBetween(Window.unboundedPreceding, 0)
df = df.withColumn("group", f.col("_c0").rlike('^"<BR>.+').cast("int"))
df = df.withColumn("id", f.monotonically_increasing_id())
df = df.withColumn("group", f.sum("group").over(w)).drop("id")
df.show(truncate=False)
#+-----------------------------+-----+
#|_c0 |group|
#+-----------------------------+-----+
#|"<BR>Datetime:2018.06.30^ |1 |
#|Name:ABC^ |1 |
#|Se:4^ |1 |
#|Machine:XXXXXXX^ |1 |
#|InnerTrace:^ |1 |
#|AdditionalInfo:^ |1 |
#|<ER>" |1 |
#|"<BR>Datetime:2018.05.30-EDT^|2 |
#|Name:DEF^ |2 |
#|Se:4^ |2 |
#|Machine:XXXXXXX^ |2 |
#|InnerTrace:^ |2 |
#|AdditionalInfo:^ |2 |
#|<ER>" |2 |
#+-----------------------------+-----+
df = df.select(
"group",
f.regexp_replace(pattern=r'(^"<BR>|<ER>"$|\^$)', replacement='', str="_c0").alias("col")
).where(f.col("col") != '')
df = df.select("group", f.split("col", ":").alias("split"))
df.show(truncate=False)
#+-----+--------------------------+
#|group|split |
#+-----+--------------------------+
#|1 |[Datetime, 2018.06.30] |
#|1 |[Name, ABC] |
#|1 |[Se, 4] |
#|1 |[Machine, XXXXXXX] |
#|1 |[InnerTrace, ] |
#|1 |[AdditionalInfo, ] |
#|2 |[Datetime, 2018.05.30-EDT]|
#|2 |[Name, DEF] |
#|2 |[Se, 4] |
#|2 |[Machine, XXXXXXX] |
#|2 |[InnerTrace, ] |
#|2 |[AdditionalInfo, ] |
#+-----+--------------------------+
df = df.select(
"group",
f.col("split").getItem(0).alias("key"),
f.col("split").getItem(1).alias("value")
)\
.groupBy("group").pivot("key").agg(f.first("value"))\
.drop("group")
df.show(truncate=False)
#+--------------+--------------+----------+-------+----+---+
#|AdditionalInfo|Datetime |InnerTrace|Machine|Name|Se |
#+--------------+--------------+----------+-------+----+---+
#| |2018.06.30 | |XXXXXXX|ABC |4 |
#| |2018.05.30-EDT| |XXXXXXX|DEF |4 |
#+--------------+--------------+----------+-------+----+---+