About how to add a new column to an existing DataFrame with random values in Scala












3















i have a dataframe with a parquet file and I have to add a new column with some random data, but I need that random data different each other. This is my actual code and the current version of spark is 1.5.1-cdh-5.5.2:



val mydf = sqlContext.read.parquet("some.parquet")
// mydf.count()
// 63385686
mydf.cache

val r = scala.util.Random
import org.apache.spark.sql.functions.udf
def myNextPositiveNumber :String = { (r.nextInt(Integer.MAX_VALUE) + 1 ).toString.concat("D")}
val myFunction = udf(myNextPositiveNumber _)
val myNewDF = mydf.withColumn("myNewColumn",lit(myNextPositiveNumber))


with this code, I have this data:



scala> myNewDF.select("myNewColumn").show(10,false)
+-----------+
|myNewColumn|
+-----------+
|889488717D |
|889488717D |
|889488717D |
|889488717D |
|889488717D |
|889488717D |
|889488717D |
|889488717D |
|889488717D |
|889488717D |
+-----------+


It looks like that the udf myNextPositiveNumber is invoked only once, isn't?



update
confirmed, there is only one distinct value:



scala> myNewDF.select("myNewColumn").distinct.show(50,false)
17/02/21 13:23:11 WARN ParquetRecordReader: Can not initialize counter due to context is not a instance of TaskInputOutputContext, but is org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl
17/02/21 13:23:11 WARN ParquetRecordReader: Can not initialize counter due to context is not a instance of TaskInputOutputContext, but is org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl
17/02/21 13:23:11 WARN ParquetRecordReader: Can not initialize counter due to context is not a instance of TaskInputOutputContext, but is org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl
17/02/21 13:23:11 WARN ParquetRecordReader: Can not initialize counter due to context is not a instance of TaskInputOutputContext, but is org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl
17/02/21 13:23:11 WARN ParquetRecordReader: Can not initialize counter due to context is not a instance of TaskInputOutputContext, but is org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl
17/02/21 13:23:11 WARN ParquetRecordReader: Can not initialize counter due to context is not a instance of TaskInputOutputContext, but is org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl
17/02/21 13:23:11 WARN ParquetRecordReader: Can not initialize counter due to context is not a instance of TaskInputOutputContext, but is org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl
...

+-----------+
|myNewColumn|
+-----------+
|889488717D |
+-----------+


what do I am doing wrong?



Update 2: finally, with the help of @user6910411 I have this code:



val mydf = sqlContext.read.parquet("some.parquet")
// mydf.count()
// 63385686
mydf.cache

val r = scala.util.Random

import org.apache.spark.sql.functions.udf

val accum = sc.accumulator(1)

def myNextPositiveNumber():String = {
accum+=1
accum.value.toString.concat("D")
}

val myFunction = udf(myNextPositiveNumber _)

val myNewDF = mydf.withColumn("myNewColumn",lit(myNextPositiveNumber))

myNewDF.select("myNewColumn").count

// 63385686


update 3



Actual code generates data like this:



scala> mydf.select("myNewColumn").show(5,false)
17/02/22 11:01:57 WARN ParquetRecordReader: Can not initialize counter due to context is not a instance of TaskInputOutputContext, but is org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl
+-----------+
|myNewColumn|
+-----------+
|2D |
|2D |
|2D |
|2D |
|2D |
+-----------+
only showing top 5 rows


It looks like the udf function is invoked only once, isn't? I need a new random element in that column.



update 4 @user6910411



i have this actual code that increases the id but it is not concatenating the final char, it is weird. This is my code:



import org.apache.spark.sql.functions.udf


val mydf = sqlContext.read.parquet("some.parquet")

mydf.cache

def myNextPositiveNumber():String = monotonically_increasing_id().toString().concat("D")

val myFunction = udf(myNextPositiveNumber _)

val myNewDF = mydf.withColumn("myNewColumn",expr(myNextPositiveNumber))

scala> myNewDF.select("myNewColumn").show(5,false)
17/02/22 12:00:02 WARN Executor: 1 block locks were not released by TID = 1:
[rdd_4_0]
+-----------+
|myNewColumn|
+-----------+
|0 |
|1 |
|2 |
|3 |
|4 |
+-----------+


I need something like:



+-----------+
|myNewColumn|
+-----------+
|1D |
|2D |
|3D |
|4D |
+-----------+









share|improve this question





























    3















    i have a dataframe with a parquet file and I have to add a new column with some random data, but I need that random data different each other. This is my actual code and the current version of spark is 1.5.1-cdh-5.5.2:



    val mydf = sqlContext.read.parquet("some.parquet")
    // mydf.count()
    // 63385686
    mydf.cache

    val r = scala.util.Random
    import org.apache.spark.sql.functions.udf
    def myNextPositiveNumber :String = { (r.nextInt(Integer.MAX_VALUE) + 1 ).toString.concat("D")}
    val myFunction = udf(myNextPositiveNumber _)
    val myNewDF = mydf.withColumn("myNewColumn",lit(myNextPositiveNumber))


    with this code, I have this data:



    scala> myNewDF.select("myNewColumn").show(10,false)
    +-----------+
    |myNewColumn|
    +-----------+
    |889488717D |
    |889488717D |
    |889488717D |
    |889488717D |
    |889488717D |
    |889488717D |
    |889488717D |
    |889488717D |
    |889488717D |
    |889488717D |
    +-----------+


    It looks like that the udf myNextPositiveNumber is invoked only once, isn't?



    update
    confirmed, there is only one distinct value:



    scala> myNewDF.select("myNewColumn").distinct.show(50,false)
    17/02/21 13:23:11 WARN ParquetRecordReader: Can not initialize counter due to context is not a instance of TaskInputOutputContext, but is org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl
    17/02/21 13:23:11 WARN ParquetRecordReader: Can not initialize counter due to context is not a instance of TaskInputOutputContext, but is org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl
    17/02/21 13:23:11 WARN ParquetRecordReader: Can not initialize counter due to context is not a instance of TaskInputOutputContext, but is org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl
    17/02/21 13:23:11 WARN ParquetRecordReader: Can not initialize counter due to context is not a instance of TaskInputOutputContext, but is org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl
    17/02/21 13:23:11 WARN ParquetRecordReader: Can not initialize counter due to context is not a instance of TaskInputOutputContext, but is org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl
    17/02/21 13:23:11 WARN ParquetRecordReader: Can not initialize counter due to context is not a instance of TaskInputOutputContext, but is org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl
    17/02/21 13:23:11 WARN ParquetRecordReader: Can not initialize counter due to context is not a instance of TaskInputOutputContext, but is org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl
    ...

    +-----------+
    |myNewColumn|
    +-----------+
    |889488717D |
    +-----------+


    what do I am doing wrong?



    Update 2: finally, with the help of @user6910411 I have this code:



    val mydf = sqlContext.read.parquet("some.parquet")
    // mydf.count()
    // 63385686
    mydf.cache

    val r = scala.util.Random

    import org.apache.spark.sql.functions.udf

    val accum = sc.accumulator(1)

    def myNextPositiveNumber():String = {
    accum+=1
    accum.value.toString.concat("D")
    }

    val myFunction = udf(myNextPositiveNumber _)

    val myNewDF = mydf.withColumn("myNewColumn",lit(myNextPositiveNumber))

    myNewDF.select("myNewColumn").count

    // 63385686


    update 3



    Actual code generates data like this:



    scala> mydf.select("myNewColumn").show(5,false)
    17/02/22 11:01:57 WARN ParquetRecordReader: Can not initialize counter due to context is not a instance of TaskInputOutputContext, but is org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl
    +-----------+
    |myNewColumn|
    +-----------+
    |2D |
    |2D |
    |2D |
    |2D |
    |2D |
    +-----------+
    only showing top 5 rows


    It looks like the udf function is invoked only once, isn't? I need a new random element in that column.



    update 4 @user6910411



    i have this actual code that increases the id but it is not concatenating the final char, it is weird. This is my code:



    import org.apache.spark.sql.functions.udf


    val mydf = sqlContext.read.parquet("some.parquet")

    mydf.cache

    def myNextPositiveNumber():String = monotonically_increasing_id().toString().concat("D")

    val myFunction = udf(myNextPositiveNumber _)

    val myNewDF = mydf.withColumn("myNewColumn",expr(myNextPositiveNumber))

    scala> myNewDF.select("myNewColumn").show(5,false)
    17/02/22 12:00:02 WARN Executor: 1 block locks were not released by TID = 1:
    [rdd_4_0]
    +-----------+
    |myNewColumn|
    +-----------+
    |0 |
    |1 |
    |2 |
    |3 |
    |4 |
    +-----------+


    I need something like:



    +-----------+
    |myNewColumn|
    +-----------+
    |1D |
    |2D |
    |3D |
    |4D |
    +-----------+









    share|improve this question



























      3












      3








      3








      i have a dataframe with a parquet file and I have to add a new column with some random data, but I need that random data different each other. This is my actual code and the current version of spark is 1.5.1-cdh-5.5.2:



      val mydf = sqlContext.read.parquet("some.parquet")
      // mydf.count()
      // 63385686
      mydf.cache

      val r = scala.util.Random
      import org.apache.spark.sql.functions.udf
      def myNextPositiveNumber :String = { (r.nextInt(Integer.MAX_VALUE) + 1 ).toString.concat("D")}
      val myFunction = udf(myNextPositiveNumber _)
      val myNewDF = mydf.withColumn("myNewColumn",lit(myNextPositiveNumber))


      with this code, I have this data:



      scala> myNewDF.select("myNewColumn").show(10,false)
      +-----------+
      |myNewColumn|
      +-----------+
      |889488717D |
      |889488717D |
      |889488717D |
      |889488717D |
      |889488717D |
      |889488717D |
      |889488717D |
      |889488717D |
      |889488717D |
      |889488717D |
      +-----------+


      It looks like that the udf myNextPositiveNumber is invoked only once, isn't?



      update
      confirmed, there is only one distinct value:



      scala> myNewDF.select("myNewColumn").distinct.show(50,false)
      17/02/21 13:23:11 WARN ParquetRecordReader: Can not initialize counter due to context is not a instance of TaskInputOutputContext, but is org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl
      17/02/21 13:23:11 WARN ParquetRecordReader: Can not initialize counter due to context is not a instance of TaskInputOutputContext, but is org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl
      17/02/21 13:23:11 WARN ParquetRecordReader: Can not initialize counter due to context is not a instance of TaskInputOutputContext, but is org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl
      17/02/21 13:23:11 WARN ParquetRecordReader: Can not initialize counter due to context is not a instance of TaskInputOutputContext, but is org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl
      17/02/21 13:23:11 WARN ParquetRecordReader: Can not initialize counter due to context is not a instance of TaskInputOutputContext, but is org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl
      17/02/21 13:23:11 WARN ParquetRecordReader: Can not initialize counter due to context is not a instance of TaskInputOutputContext, but is org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl
      17/02/21 13:23:11 WARN ParquetRecordReader: Can not initialize counter due to context is not a instance of TaskInputOutputContext, but is org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl
      ...

      +-----------+
      |myNewColumn|
      +-----------+
      |889488717D |
      +-----------+


      what do I am doing wrong?



      Update 2: finally, with the help of @user6910411 I have this code:



      val mydf = sqlContext.read.parquet("some.parquet")
      // mydf.count()
      // 63385686
      mydf.cache

      val r = scala.util.Random

      import org.apache.spark.sql.functions.udf

      val accum = sc.accumulator(1)

      def myNextPositiveNumber():String = {
      accum+=1
      accum.value.toString.concat("D")
      }

      val myFunction = udf(myNextPositiveNumber _)

      val myNewDF = mydf.withColumn("myNewColumn",lit(myNextPositiveNumber))

      myNewDF.select("myNewColumn").count

      // 63385686


      update 3



      Actual code generates data like this:



      scala> mydf.select("myNewColumn").show(5,false)
      17/02/22 11:01:57 WARN ParquetRecordReader: Can not initialize counter due to context is not a instance of TaskInputOutputContext, but is org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl
      +-----------+
      |myNewColumn|
      +-----------+
      |2D |
      |2D |
      |2D |
      |2D |
      |2D |
      +-----------+
      only showing top 5 rows


      It looks like the udf function is invoked only once, isn't? I need a new random element in that column.



      update 4 @user6910411



      i have this actual code that increases the id but it is not concatenating the final char, it is weird. This is my code:



      import org.apache.spark.sql.functions.udf


      val mydf = sqlContext.read.parquet("some.parquet")

      mydf.cache

      def myNextPositiveNumber():String = monotonically_increasing_id().toString().concat("D")

      val myFunction = udf(myNextPositiveNumber _)

      val myNewDF = mydf.withColumn("myNewColumn",expr(myNextPositiveNumber))

      scala> myNewDF.select("myNewColumn").show(5,false)
      17/02/22 12:00:02 WARN Executor: 1 block locks were not released by TID = 1:
      [rdd_4_0]
      +-----------+
      |myNewColumn|
      +-----------+
      |0 |
      |1 |
      |2 |
      |3 |
      |4 |
      +-----------+


      I need something like:



      +-----------+
      |myNewColumn|
      +-----------+
      |1D |
      |2D |
      |3D |
      |4D |
      +-----------+









      share|improve this question
















      i have a dataframe with a parquet file and I have to add a new column with some random data, but I need that random data different each other. This is my actual code and the current version of spark is 1.5.1-cdh-5.5.2:



      val mydf = sqlContext.read.parquet("some.parquet")
      // mydf.count()
      // 63385686
      mydf.cache

      val r = scala.util.Random
      import org.apache.spark.sql.functions.udf
      def myNextPositiveNumber :String = { (r.nextInt(Integer.MAX_VALUE) + 1 ).toString.concat("D")}
      val myFunction = udf(myNextPositiveNumber _)
      val myNewDF = mydf.withColumn("myNewColumn",lit(myNextPositiveNumber))


      with this code, I have this data:



      scala> myNewDF.select("myNewColumn").show(10,false)
      +-----------+
      |myNewColumn|
      +-----------+
      |889488717D |
      |889488717D |
      |889488717D |
      |889488717D |
      |889488717D |
      |889488717D |
      |889488717D |
      |889488717D |
      |889488717D |
      |889488717D |
      +-----------+


      It looks like that the udf myNextPositiveNumber is invoked only once, isn't?



      update
      confirmed, there is only one distinct value:



      scala> myNewDF.select("myNewColumn").distinct.show(50,false)
      17/02/21 13:23:11 WARN ParquetRecordReader: Can not initialize counter due to context is not a instance of TaskInputOutputContext, but is org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl
      17/02/21 13:23:11 WARN ParquetRecordReader: Can not initialize counter due to context is not a instance of TaskInputOutputContext, but is org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl
      17/02/21 13:23:11 WARN ParquetRecordReader: Can not initialize counter due to context is not a instance of TaskInputOutputContext, but is org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl
      17/02/21 13:23:11 WARN ParquetRecordReader: Can not initialize counter due to context is not a instance of TaskInputOutputContext, but is org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl
      17/02/21 13:23:11 WARN ParquetRecordReader: Can not initialize counter due to context is not a instance of TaskInputOutputContext, but is org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl
      17/02/21 13:23:11 WARN ParquetRecordReader: Can not initialize counter due to context is not a instance of TaskInputOutputContext, but is org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl
      17/02/21 13:23:11 WARN ParquetRecordReader: Can not initialize counter due to context is not a instance of TaskInputOutputContext, but is org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl
      ...

      +-----------+
      |myNewColumn|
      +-----------+
      |889488717D |
      +-----------+


      what do I am doing wrong?



      Update 2: finally, with the help of @user6910411 I have this code:



      val mydf = sqlContext.read.parquet("some.parquet")
      // mydf.count()
      // 63385686
      mydf.cache

      val r = scala.util.Random

      import org.apache.spark.sql.functions.udf

      val accum = sc.accumulator(1)

      def myNextPositiveNumber():String = {
      accum+=1
      accum.value.toString.concat("D")
      }

      val myFunction = udf(myNextPositiveNumber _)

      val myNewDF = mydf.withColumn("myNewColumn",lit(myNextPositiveNumber))

      myNewDF.select("myNewColumn").count

      // 63385686


      update 3



      Actual code generates data like this:



      scala> mydf.select("myNewColumn").show(5,false)
      17/02/22 11:01:57 WARN ParquetRecordReader: Can not initialize counter due to context is not a instance of TaskInputOutputContext, but is org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl
      +-----------+
      |myNewColumn|
      +-----------+
      |2D |
      |2D |
      |2D |
      |2D |
      |2D |
      +-----------+
      only showing top 5 rows


      It looks like the udf function is invoked only once, isn't? I need a new random element in that column.



      update 4 @user6910411



      i have this actual code that increases the id but it is not concatenating the final char, it is weird. This is my code:



      import org.apache.spark.sql.functions.udf


      val mydf = sqlContext.read.parquet("some.parquet")

      mydf.cache

      def myNextPositiveNumber():String = monotonically_increasing_id().toString().concat("D")

      val myFunction = udf(myNextPositiveNumber _)

      val myNewDF = mydf.withColumn("myNewColumn",expr(myNextPositiveNumber))

      scala> myNewDF.select("myNewColumn").show(5,false)
      17/02/22 12:00:02 WARN Executor: 1 block locks were not released by TID = 1:
      [rdd_4_0]
      +-----------+
      |myNewColumn|
      +-----------+
      |0 |
      |1 |
      |2 |
      |3 |
      |4 |
      +-----------+


      I need something like:



      +-----------+
      |myNewColumn|
      +-----------+
      |1D |
      |2D |
      |3D |
      |4D |
      +-----------+






      scala apache-spark random apache-spark-sql user-defined-functions






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Oct 16 '18 at 12:00









      lospejos

      1,50621426




      1,50621426










      asked Feb 21 '17 at 12:32









      aironmanaironman

      41611135




      41611135
























          2 Answers
          2






          active

          oldest

          votes


















          12














          Spark >= 2.3



          It is possible to disable some optimizations using asNondeterministic method:



          import org.apache.spark.sql.expressions.UserDefinedFunction

          val f: UserDefinedFunction = ???
          val fNonDeterministic: UserDefinedFunction = f.asNondeterministic


          Please make sure you understand the guarantees before using this option.



          Spark < 2.3



          Function which is passed to udf should be deterministic (with possible exception of SPARK-20586) and nullary functions calls can be replaced by constants. If you want to generate random numbers use on of the built-in functions:





          • rand - Generate a random column with independent and identically distributed (i.i.d.) samples from U[0.0, 1.0].


          • randn - Generate a column with independent and identically distributed (i.i.d.) samples from the standard normal distribution.


          and transform the output to obtain required distribution for example:



          (rand * Integer.MAX_VALUE).cast("bigint").cast("string")





          share|improve this answer

































            0














            You can make use of monotonically_increasing_id to generate random values.



            Then you can define a UDF to append any string to it after casting it to String as monotonically_increasing_id returns Long by default.



            scala> var df = Seq(("Ron"), ("John"), ("Steve"), ("Brawn"), ("Rock"), ("Rick")).toDF("names")
            +-----+
            |names|
            +-----+
            | Ron|
            | John|
            |Steve|
            |Brawn|
            | Rock|
            | Rick|
            +-----+

            scala> val appendD = spark.sqlContext.udf.register("appendD", (s: String) => s.concat("D"))

            scala> df = df.withColumn("ID",monotonically_increasing_id).selectExpr("names","cast(ID as String) ID").withColumn("ID",appendD($"ID"))
            +-----+---+
            |names| ID|
            +-----+---+
            | Ron| 0D|
            | John| 1D|
            |Steve| 2D|
            |Brawn| 3D|
            | Rock| 4D|
            | Rick| 5D|
            +-----+---+





            share|improve this answer





















            • 1





              Just a few notes: You should really remove the first line - You can make use of monotonicallyIncreasingId to generate random values . monotonically_increasing_id is nothing, but random. It is strictly deterministic, given the distribution. Also monotonicallyIncreasingId has been deprecated in 2.0. You should use monotonically_increasing_id instead.

              – user6910411
              Jun 25 '18 at 13:29













            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f42367464%2fabout-how-to-add-a-new-column-to-an-existing-dataframe-with-random-values-in-sca%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            2 Answers
            2






            active

            oldest

            votes








            2 Answers
            2






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            12














            Spark >= 2.3



            It is possible to disable some optimizations using asNondeterministic method:



            import org.apache.spark.sql.expressions.UserDefinedFunction

            val f: UserDefinedFunction = ???
            val fNonDeterministic: UserDefinedFunction = f.asNondeterministic


            Please make sure you understand the guarantees before using this option.



            Spark < 2.3



            Function which is passed to udf should be deterministic (with possible exception of SPARK-20586) and nullary functions calls can be replaced by constants. If you want to generate random numbers use on of the built-in functions:





            • rand - Generate a random column with independent and identically distributed (i.i.d.) samples from U[0.0, 1.0].


            • randn - Generate a column with independent and identically distributed (i.i.d.) samples from the standard normal distribution.


            and transform the output to obtain required distribution for example:



            (rand * Integer.MAX_VALUE).cast("bigint").cast("string")





            share|improve this answer






























              12














              Spark >= 2.3



              It is possible to disable some optimizations using asNondeterministic method:



              import org.apache.spark.sql.expressions.UserDefinedFunction

              val f: UserDefinedFunction = ???
              val fNonDeterministic: UserDefinedFunction = f.asNondeterministic


              Please make sure you understand the guarantees before using this option.



              Spark < 2.3



              Function which is passed to udf should be deterministic (with possible exception of SPARK-20586) and nullary functions calls can be replaced by constants. If you want to generate random numbers use on of the built-in functions:





              • rand - Generate a random column with independent and identically distributed (i.i.d.) samples from U[0.0, 1.0].


              • randn - Generate a column with independent and identically distributed (i.i.d.) samples from the standard normal distribution.


              and transform the output to obtain required distribution for example:



              (rand * Integer.MAX_VALUE).cast("bigint").cast("string")





              share|improve this answer




























                12












                12








                12







                Spark >= 2.3



                It is possible to disable some optimizations using asNondeterministic method:



                import org.apache.spark.sql.expressions.UserDefinedFunction

                val f: UserDefinedFunction = ???
                val fNonDeterministic: UserDefinedFunction = f.asNondeterministic


                Please make sure you understand the guarantees before using this option.



                Spark < 2.3



                Function which is passed to udf should be deterministic (with possible exception of SPARK-20586) and nullary functions calls can be replaced by constants. If you want to generate random numbers use on of the built-in functions:





                • rand - Generate a random column with independent and identically distributed (i.i.d.) samples from U[0.0, 1.0].


                • randn - Generate a column with independent and identically distributed (i.i.d.) samples from the standard normal distribution.


                and transform the output to obtain required distribution for example:



                (rand * Integer.MAX_VALUE).cast("bigint").cast("string")





                share|improve this answer















                Spark >= 2.3



                It is possible to disable some optimizations using asNondeterministic method:



                import org.apache.spark.sql.expressions.UserDefinedFunction

                val f: UserDefinedFunction = ???
                val fNonDeterministic: UserDefinedFunction = f.asNondeterministic


                Please make sure you understand the guarantees before using this option.



                Spark < 2.3



                Function which is passed to udf should be deterministic (with possible exception of SPARK-20586) and nullary functions calls can be replaced by constants. If you want to generate random numbers use on of the built-in functions:





                • rand - Generate a random column with independent and identically distributed (i.i.d.) samples from U[0.0, 1.0].


                • randn - Generate a column with independent and identically distributed (i.i.d.) samples from the standard normal distribution.


                and transform the output to obtain required distribution for example:



                (rand * Integer.MAX_VALUE).cast("bigint").cast("string")






                share|improve this answer














                share|improve this answer



                share|improve this answer








                edited Dec 14 '17 at 16:30

























                answered Feb 21 '17 at 12:40









                user6910411user6910411

                35.3k1089108




                35.3k1089108

























                    0














                    You can make use of monotonically_increasing_id to generate random values.



                    Then you can define a UDF to append any string to it after casting it to String as monotonically_increasing_id returns Long by default.



                    scala> var df = Seq(("Ron"), ("John"), ("Steve"), ("Brawn"), ("Rock"), ("Rick")).toDF("names")
                    +-----+
                    |names|
                    +-----+
                    | Ron|
                    | John|
                    |Steve|
                    |Brawn|
                    | Rock|
                    | Rick|
                    +-----+

                    scala> val appendD = spark.sqlContext.udf.register("appendD", (s: String) => s.concat("D"))

                    scala> df = df.withColumn("ID",monotonically_increasing_id).selectExpr("names","cast(ID as String) ID").withColumn("ID",appendD($"ID"))
                    +-----+---+
                    |names| ID|
                    +-----+---+
                    | Ron| 0D|
                    | John| 1D|
                    |Steve| 2D|
                    |Brawn| 3D|
                    | Rock| 4D|
                    | Rick| 5D|
                    +-----+---+





                    share|improve this answer





















                    • 1





                      Just a few notes: You should really remove the first line - You can make use of monotonicallyIncreasingId to generate random values . monotonically_increasing_id is nothing, but random. It is strictly deterministic, given the distribution. Also monotonicallyIncreasingId has been deprecated in 2.0. You should use monotonically_increasing_id instead.

                      – user6910411
                      Jun 25 '18 at 13:29


















                    0














                    You can make use of monotonically_increasing_id to generate random values.



                    Then you can define a UDF to append any string to it after casting it to String as monotonically_increasing_id returns Long by default.



                    scala> var df = Seq(("Ron"), ("John"), ("Steve"), ("Brawn"), ("Rock"), ("Rick")).toDF("names")
                    +-----+
                    |names|
                    +-----+
                    | Ron|
                    | John|
                    |Steve|
                    |Brawn|
                    | Rock|
                    | Rick|
                    +-----+

                    scala> val appendD = spark.sqlContext.udf.register("appendD", (s: String) => s.concat("D"))

                    scala> df = df.withColumn("ID",monotonically_increasing_id).selectExpr("names","cast(ID as String) ID").withColumn("ID",appendD($"ID"))
                    +-----+---+
                    |names| ID|
                    +-----+---+
                    | Ron| 0D|
                    | John| 1D|
                    |Steve| 2D|
                    |Brawn| 3D|
                    | Rock| 4D|
                    | Rick| 5D|
                    +-----+---+





                    share|improve this answer





















                    • 1





                      Just a few notes: You should really remove the first line - You can make use of monotonicallyIncreasingId to generate random values . monotonically_increasing_id is nothing, but random. It is strictly deterministic, given the distribution. Also monotonicallyIncreasingId has been deprecated in 2.0. You should use monotonically_increasing_id instead.

                      – user6910411
                      Jun 25 '18 at 13:29
















                    0












                    0








                    0







                    You can make use of monotonically_increasing_id to generate random values.



                    Then you can define a UDF to append any string to it after casting it to String as monotonically_increasing_id returns Long by default.



                    scala> var df = Seq(("Ron"), ("John"), ("Steve"), ("Brawn"), ("Rock"), ("Rick")).toDF("names")
                    +-----+
                    |names|
                    +-----+
                    | Ron|
                    | John|
                    |Steve|
                    |Brawn|
                    | Rock|
                    | Rick|
                    +-----+

                    scala> val appendD = spark.sqlContext.udf.register("appendD", (s: String) => s.concat("D"))

                    scala> df = df.withColumn("ID",monotonically_increasing_id).selectExpr("names","cast(ID as String) ID").withColumn("ID",appendD($"ID"))
                    +-----+---+
                    |names| ID|
                    +-----+---+
                    | Ron| 0D|
                    | John| 1D|
                    |Steve| 2D|
                    |Brawn| 3D|
                    | Rock| 4D|
                    | Rick| 5D|
                    +-----+---+





                    share|improve this answer















                    You can make use of monotonically_increasing_id to generate random values.



                    Then you can define a UDF to append any string to it after casting it to String as monotonically_increasing_id returns Long by default.



                    scala> var df = Seq(("Ron"), ("John"), ("Steve"), ("Brawn"), ("Rock"), ("Rick")).toDF("names")
                    +-----+
                    |names|
                    +-----+
                    | Ron|
                    | John|
                    |Steve|
                    |Brawn|
                    | Rock|
                    | Rick|
                    +-----+

                    scala> val appendD = spark.sqlContext.udf.register("appendD", (s: String) => s.concat("D"))

                    scala> df = df.withColumn("ID",monotonically_increasing_id).selectExpr("names","cast(ID as String) ID").withColumn("ID",appendD($"ID"))
                    +-----+---+
                    |names| ID|
                    +-----+---+
                    | Ron| 0D|
                    | John| 1D|
                    |Steve| 2D|
                    |Brawn| 3D|
                    | Rock| 4D|
                    | Rick| 5D|
                    +-----+---+






                    share|improve this answer














                    share|improve this answer



                    share|improve this answer








                    edited Jun 25 '18 at 18:04

























                    answered Jun 23 '18 at 9:12









                    Avik AggarwalAvik Aggarwal

                    162116




                    162116








                    • 1





                      Just a few notes: You should really remove the first line - You can make use of monotonicallyIncreasingId to generate random values . monotonically_increasing_id is nothing, but random. It is strictly deterministic, given the distribution. Also monotonicallyIncreasingId has been deprecated in 2.0. You should use monotonically_increasing_id instead.

                      – user6910411
                      Jun 25 '18 at 13:29
















                    • 1





                      Just a few notes: You should really remove the first line - You can make use of monotonicallyIncreasingId to generate random values . monotonically_increasing_id is nothing, but random. It is strictly deterministic, given the distribution. Also monotonicallyIncreasingId has been deprecated in 2.0. You should use monotonically_increasing_id instead.

                      – user6910411
                      Jun 25 '18 at 13:29










                    1




                    1





                    Just a few notes: You should really remove the first line - You can make use of monotonicallyIncreasingId to generate random values . monotonically_increasing_id is nothing, but random. It is strictly deterministic, given the distribution. Also monotonicallyIncreasingId has been deprecated in 2.0. You should use monotonically_increasing_id instead.

                    – user6910411
                    Jun 25 '18 at 13:29







                    Just a few notes: You should really remove the first line - You can make use of monotonicallyIncreasingId to generate random values . monotonically_increasing_id is nothing, but random. It is strictly deterministic, given the distribution. Also monotonicallyIncreasingId has been deprecated in 2.0. You should use monotonically_increasing_id instead.

                    – user6910411
                    Jun 25 '18 at 13:29




















                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f42367464%2fabout-how-to-add-a-new-column-to-an-existing-dataframe-with-random-values-in-sca%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    android studio warns about leanback feature tag usage required on manifest while using Unity exported app?

                    SQL update select statement

                    'app-layout' is not a known element: how to share Component with different Modules