【问题标题】:Using User defined function written in python across notebooks in azure Databricks在 azure Databricks 中跨笔记本使用用 python 编写的用户定义函数
【发布时间】:2021-07-08 06:26:30
【问题描述】:

我在 Databricks 笔记本中使用 python 创建了一个函数

%python


import numpy as np 
from pyspark.sql.functions import udf
# from pyspark.sql.types import DateType
def get_work_day(start_date,work_days_to_be_added,site_work_days,holidays_list):
  holidays_list = list(holidays_list)
  if (site_work_days == 5):
    work_days = '1111100'
  elif (site_work_days == 6):
    work_days = '1111110'
  elif (site_work_days == 7):
    work_days = '1111111'
  elif (site_work_days == 1):
    work_days = '1000000'
  elif (site_work_days == 2):
    work_days = '1100000'
  elif (site_work_days == 3):
    work_days = '1110000'
  elif (site_work_days == 4):
    work_days = '1111000'  
  dt = np.busday_offset(start_date,work_days_to_be_added,roll='forward',weekmask = work_days,holidays=holidays_list)
  return str(dt)


spark.udf.register("get_work_day()", get_work_day)

当我从同一个笔记本调用它时它工作正常,但当我从其他笔记本调用它时抛出一个错误。

我在 SQL 代码中调用上述函数,并且 SQL 代码在同一个笔记本中执行时工作正常,但在我在其他笔记本中运行时它会中断

Select column_with_date_value,get_work_day(column_with_date_value,4,4,('2021-05-06','2021-05-07')) from db.samp

我得到的错误是

DatabricksExceptions$SQLExecutionException: org.apache.spark.sql.AnalysisException: Undefined function: 'get_work_day'. This function is neither a registered temporary function nor a permanent function registered in the database 'default'.; line 1 pos 28

谁能告诉我如何注册此功能,以便他们可以跨笔记本使用。

【问题讨论】:

    标签: python sql apache-spark pyspark databricks


    【解决方案1】:

    您可以处理%run 命令和widgets。例子

    pgm-01:

    dbutils.widgets.dropdown("even","2",['2','4','6','8'])
    print('this is even widgets',dbutils.widgets.get('even'))
    
    dbutils.widgets.dropdown("odd","1",['1','3','5','9'])
    print('this is even widgets',dbutils.widgets.get('odd'))
    

    这样你就可以从 pgm-02 调用 pgm-01 并传递值

    %run ./pgm1 $odd='100'
    

    经过测试的丝网印刷:

    【讨论】:

      【解决方案2】:

      我找到了一些很好的资源来帮助我解决这个问题。

      解释使用 %run 'path' 的论坛:https://community.databricks.com/s/question/0D53f00001HKHdNCAX/can-i-run-one-notebook-from-another-notebook

      Youtube 视频解释了如何使用 dbutils.notebook.run('path',timeout_in_seconds): https://www.youtube.com/watch?v=B1DyJScg0-k&t=180s *虽然这只允许你运行另一个笔记本,传递变量并退出它,但它不允许在另一个笔记本中使用函数(我找不到)

      为了简化我所做的事情: Notebook1 (path = './Notebook1') 包含一个函数:

      def PrintFunction():
          print("Hello World")
          
      dbutils.notebook.exit("SUCCESS")
      

      Notebook2 必须这样做:

      %run './Notebook1' 
      

      在 Databricks 中的单独命令块中的命令,并且必须位于使用该功能的命令块之前。

      在以下命令块中,您可以简单地调用该函数:

      PrintFunction()
      

      结果:Hello World

      【讨论】:

        猜你喜欢
        • 2020-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-03
        • 2022-07-27
        • 2022-07-15
        • 1970-01-01
        • 2022-01-20
        相关资源
        最近更新 更多