我有一个数据集,我需要根据索引位置从一列中提取数据
SERVICE_NAME列包含“ ISPFSDPartnerPubSub / 4_2 / ProxyServices / InboundAndOutbound / AP / InboundPartnerCommunicationsAPLPPS” 我需要根据第4和第5个索引提取“ colX”和“ colY”
我该如何实现?
val log = spark.read.format("csv")
.option("inferSchema", "true")
.option("header", "true")
.option("sep", ",")
.option("quote", "\"")
.option("multiLine", "true")
.load("OSB.csv").cache()
val logs = log.withColumn("Id", monotonicallyIncreasingId()+1)
val df = spark.sql("select SERVICE_NAME, _raw from logs")
预期输出 第十课:AP Y栏:InboundPartnerCommunicationsAPLPPS
答案 0 :(得分:0)
更新::用于选择由索引指定的字符串部分,可以使用以下代码:
val df = Seq("ISPFSDPartnerPubSub/4_2/ProxyServices/InboundAndOutbound/AP/InboundPartnerCommunicationsAPLPPS").toDF("SERVICE_NAME")
val result =
df
.withColumn("splitted", split($"SERVICE_NAME", "/"))
.select(
$"splitted".getItem(4).alias("colX"),
$"splitted".getItem(5).alias("colY")
)
result.show(false)
输出:
+----+----------------------------------+
|colX|colY |
+----+----------------------------------+
|AP |InboundPartnerCommunicationsAPLPPS|
+----+----------------------------------+
按索引的列的解决方案: 通过列索引选择两个列并进行重命名可以通过以下方式完成:
df.select(
col(df.columns(4)).alias("colX"),
col(df.columns(5)).alias("colY"))