web-dev-qa-db-fra.com

créer une colonne de sous-chaîne dans spark dataframe

Je veux prendre un fichier JSON et le mapper de sorte que l'une des colonnes soit une sous-chaîne d'une autre. Par exemple, prenons le tableau de gauche et produisons le tableau de droite:

 ------------              ------------------------
|     a      |             |      a     |    b    |
|------------|       ->    |------------|---------|
|hello, world|             |hello, world|  hello  |

Je peux le faire en utilisant la syntaxe spark-sql mais comment peut-on utiliser les fonctions intégrées? 

3
J Smith

Une telle déclaration peut être utilisée

import org.Apache.spark.sql.functions._

dataFrame.select(col("a"), substring_index(col("a"), ",", 1).as("b"))

6
pasha701

Vous utiliseriez la fonction withColumn

import org.Apache.spark.sql.functions.{ udf, col }
def substringFn(str: String) = your substring code
val substring = udf(substringFn _)
dataframe.withColumn("b", substring(col("a"))
4
soote

Supposons que vous ayez le dataframe suivant:

import spark.implicits._
import org.Apache.spark.sql.functions._

var df = sc.parallelize(Seq(("foobar", "foo"))).toDF("a", "b")

+------+---+
|     a|  b|
+------+---+
|foobar|foo|
+------+---+

Vous pouvez créer une nouvelle colonne à partir de la première colonne comme suit:

df = df.select(col("*"), substring(col("a"), 4, 6).as("c"))

+------+---+---+
|     a|  b|  c|
+------+---+---+
|foobar|foo|bar|
+------+---+---+
2
Balázs Fehér

Juste pour enrichir les réponses existantes. Au cas où vous seriez intéressé par la partie droite de la colonne de chaîne. C'est:

 ------------              ------------------------
|     a      |             |      a     |    b    |
|------------|       ->    |------------|---------|
|hello, world|             |hello, world|  world  |

Vous devriez utiliser un index négatif:

dataFrame.select(col("a"), substring_index(col("a"), ",", -1).as("b"))
0
Ignacio Alorre