如何基于索引从数据框中提取数据

时间:2019-04-15 11:46:22

标签: scala apache-spark

我有一个数据集,我需要根据索引位置从一列中提取数据

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

1 个答案:

答案 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"))