向 Dataframe 添加一个新列。新专栏我希望它是一个 UUID 生成器
Add a new column to a Dataframe. New column i want it to be a UUID generator
我想向 Dataframe 添加一个新列,一个 UUID 生成器。
UUID 值类似于 21534cf7-cff9-482a-a3a8-9e7244240da7
我的研究:
我试过在 spark 中使用 withColumn
方法。
val DF2 = DF1.withColumn("newcolname", DF1("existingcolname" + 1)
所以 DF2 将有额外的列 newcolname
并在所有行中添加 1。
根据我的要求,我想要一个可以生成 UUID 的新列。
你应该尝试这样的事情:
val sc: SparkContext = ...
val sqlContext = new SQLContext(sc)
import sqlContext.implicits._
val generateUUID = udf(() => UUID.randomUUID().toString)
val df1 = Seq(("id1", 1), ("id2", 4), ("id3", 5)).toDF("id", "value")
val df2 = df1.withColumn("UUID", generateUUID())
df1.show()
df2.show()
输出将是:
+---+-----+
| id|value|
+---+-----+
|id1| 1|
|id2| 4|
|id3| 5|
+---+-----+
+---+-----+--------------------+
| id|value| UUID|
+---+-----+--------------------+
|id1| 1|f0cfd0e2-fbbe-40f...|
|id2| 4|ec8db8b9-70db-46f...|
|id3| 5|e0e91292-1d90-45a...|
+---+-----+--------------------+
这就是我们在 Java 中所做的,我们有一个日期列,想添加另一个包含月份的列。
Dataset<Row> newData = data.withColumn("month", month((unix_timestamp(col("date"), "MM/dd/yyyy")).cast("timestamp")));
您可以使用类似的技术来添加任何列。
Dataset<Row> newData1 = newData.withColumn("uuid", lit(UUID.randomUUID().toString()));
干杯!
您可以利用内置的 Spark SQL uuid 函数:
.withColumn("uuid", expr("uuid()"))
Scala 中的完整示例:
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._
import org.apache.spark.sql.types._
object CreateDf extends App {
val spark = SparkSession.builder
.master("local[*]")
.appName("spark_local")
.getOrCreate()
import spark.implicits._
Seq(1, 2, 3).toDF("col1")
.withColumn("uuid", expr("uuid()"))
.show(false)
}
输出:
+----+------------------------------------+
|col1|uuid |
+----+------------------------------------+
|1 |24181c68-51b7-42ea-a9fd-f88dcfa10062|
|2 |7cd21b25-017e-4567-bdd3-f33b001ee497|
|3 |1df7cfa8-af8a-4421-834f-5359dc3ae417|
+----+------------------------------------+
我想向 Dataframe 添加一个新列,一个 UUID 生成器。
UUID 值类似于 21534cf7-cff9-482a-a3a8-9e7244240da7
我的研究:
我试过在 spark 中使用 withColumn
方法。
val DF2 = DF1.withColumn("newcolname", DF1("existingcolname" + 1)
所以 DF2 将有额外的列 newcolname
并在所有行中添加 1。
根据我的要求,我想要一个可以生成 UUID 的新列。
你应该尝试这样的事情:
val sc: SparkContext = ...
val sqlContext = new SQLContext(sc)
import sqlContext.implicits._
val generateUUID = udf(() => UUID.randomUUID().toString)
val df1 = Seq(("id1", 1), ("id2", 4), ("id3", 5)).toDF("id", "value")
val df2 = df1.withColumn("UUID", generateUUID())
df1.show()
df2.show()
输出将是:
+---+-----+
| id|value|
+---+-----+
|id1| 1|
|id2| 4|
|id3| 5|
+---+-----+
+---+-----+--------------------+
| id|value| UUID|
+---+-----+--------------------+
|id1| 1|f0cfd0e2-fbbe-40f...|
|id2| 4|ec8db8b9-70db-46f...|
|id3| 5|e0e91292-1d90-45a...|
+---+-----+--------------------+
这就是我们在 Java 中所做的,我们有一个日期列,想添加另一个包含月份的列。
Dataset<Row> newData = data.withColumn("month", month((unix_timestamp(col("date"), "MM/dd/yyyy")).cast("timestamp")));
您可以使用类似的技术来添加任何列。
Dataset<Row> newData1 = newData.withColumn("uuid", lit(UUID.randomUUID().toString()));
干杯!
您可以利用内置的 Spark SQL uuid 函数:
.withColumn("uuid", expr("uuid()"))
Scala 中的完整示例:
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._
import org.apache.spark.sql.types._
object CreateDf extends App {
val spark = SparkSession.builder
.master("local[*]")
.appName("spark_local")
.getOrCreate()
import spark.implicits._
Seq(1, 2, 3).toDF("col1")
.withColumn("uuid", expr("uuid()"))
.show(false)
}
输出:
+----+------------------------------------+
|col1|uuid |
+----+------------------------------------+
|1 |24181c68-51b7-42ea-a9fd-f88dcfa10062|
|2 |7cd21b25-017e-4567-bdd3-f33b001ee497|
|3 |1df7cfa8-af8a-4421-834f-5359dc3ae417|
+----+------------------------------------+