Невозможно сгенерировать UUID в Spark SQL

ниже приведен блок кода и полученная ошибка

> creating a temporary views 
sqlcontext.sql("""CREATE TEMPORARY VIEW temp_pay_txn_stage
     USING org.apache.spark.sql.cassandra
     OPTIONS (
       table "t_pay_txn_stage",
       keyspace "ks_pay",
       cluster "Test Cluster",
       pushdown "true"
     )""".stripMargin)

sqlcontext.sql("""CREATE TEMPORARY VIEW temp_pay_txn_source
     USING org.apache.spark.sql.cassandra
     OPTIONS (
       table "t_pay_txn_source",
       keyspace "ks_pay",
       cluster "Test Cluster",
       pushdown "true"
     )""".stripMargin)

запрос представлений, как показано ниже, чтобы иметь возможность получать новые записи со сцены, отсутствующей в источнике.

Scala> val df_newrecords = sqlcontext.sql("""Select UUID(),
 | |stage.order_id,
 | |stage.order_description,
 | |stage.transaction_id,
 | |stage.pre_transaction_freeze_balance,
 | |stage.post_transaction_freeze_balance,
 | |toTimestamp(now()),
 | |NULL,
 | |1 from temp_pay_txn_stage  stage left join temp_pay_txn_source source on stage.order_id=source.order_id and stage.transaction_id=source.transaction_id where
 | |source.order_id is null and source.transaction_id is null""")`



org.apache.spark.sql.AnalysisException: Undefined function: 'uuid()'. This function is neither a registered temporary function nor a permanent function registered in the database 'default'.; line 1 pos 7  

Я пытаюсь получить сгенерированные UUID, но получаю эту ошибку.


person Goutham    schedule 30.03.2017    source источник
comment
Отметьте этот ответ stackoverflow.com/a/37232099/2320144   -  person Ashraful Islam    schedule 30.03.2017
comment
Спасибо @AshrafulIslam, при попытке ответа возникла следующая ошибка. scala ›val sqlContext = new SQLContext (sc) warning: было одно предупреждение об устаревании; повторно запустите с -deprecation для получения подробной информации sqlContext: org.apache.spark.sql.SQLContext = org.apache.spark.sql.SQLContext@39ab2bf3 scala ›scala› import sqlContext.implicits._ import sqlContext.implicits._ scala ›val generateUUID = udf (() = ›UUID.randomUUID (). toString) ‹console›: 46: ошибка: не найдено: значение UUID val generateUUID = udf (() =› UUID.randomUUID (). toString) ^   -  person Goutham    schedule 31.03.2017
comment
А пока я использовал обходной путь для генерации UUID в самом источнике и использования их при выполнении операции scd 2.   -  person Goutham    schedule 31.03.2017


Ответы (1)


Вот простой пример создания timeuuid:

import org.apache.spark.sql.SQLContext    
val sqlcontext = new SQLContext(sc)

import sqlcontext.implicits._

//Import UUIDs that contains the method timeBased()
import com.datastax.driver.core.utils.UUIDs

//user define function timeUUID  which will retrun time based uuid      
val timeUUID = udf(() => UUIDs.timeBased().toString)

//sample query to test, you can change it to yours
val df_newrecords = sqlcontext.sql("SELECT 1 as data UNION SELECT 2 as data").withColumn("time_uuid", timeUUID())

//print all the rows
df_newrecords.collect().foreach(println)

Выход :

[1,9a81b3c0-170b-11e7-98bf-9bb55f3128dd]
[2,9a831350-170b-11e7-98bf-9bb55f3128dd]

Источник: https://stackoverflow.com/a/37232099/2320144 https://docs.datastax.com/en/drivers/java/2.0/com/datastax/driver/core/utils/UUIDs.html#timeBased--

person Ashraful Islam    schedule 01.04.2017