将 Scala 代码转换为 Python 以进行报告

Sam*_*Sam -5 python scala apache-spark

我在 Scala 中有这段代码,但对 Python 不太熟悉,无法转换它:

val formatterComma = java.text.NumberFormat.getIntegerInstance

def createTD(value: String) : String = {
  return s"""<td align="center" style="border:1px solid">${value}</td>"""
}

def createTD(value: BigInt) : String = {
  return createTD(value.toString)
}

def createTDDouble(value: Double) : String = {
  return createTD("$" + formatterComma.format(value))
}

def createTheLink(productId: String) : String = {
  return s"""<td align="center" style="border:1px solid"><a href="https://productLink/$product>Link Here</a></td>"""
}

def createTH(value: String) : String = {
  return s"""<th class="gmail-highlight-red gmail-confluenceTh gmail-tablesorter-header gmail-sortableHeader gmail-tablesorter-headerUnSorted" tabindex="0" scope="col" style="width:1px;white-space:nowrap;border:1px solid #000000;padding:7px 15px 7px 10px;vertical-align:top;text-align:center;background:100% 50% no-repeat">
            <div class="gmail-tablesorter-header-inner" style="margin:0px;padding:0px"><h2 title="" style="margin:0.2px 0px 0px;padding:0px;font-size:20px;font-weight:normal;line-height:1.5;letter-spacing:-0.008em;border-bottom-color:rgb(50,199,208))"><strong>${value}</strong></h2>
            </div>
            </th>"""
}

final case class resultsOfReport (name: String, email: String, phone:String, productId : String, product: String,  cost : Double, reduction : Double);

def runReport(elements: Array[resultsOfReport]): String = {
  return elements.map {
        case resultsOfReport (name, email, phone, productId, product, cost, stillInStock)
         => s"""<tr>${createTD(name)}${createTD(email)}${createTD(phone)}${createTD(productId)}${createTD(product)}${createTDDouble(cost)}${createTDDouble(reduction)}${createTheLink(productId)}${createTD("Link to product")}</tr>"""
      }.mkString(s"""<table class="gmail-relative-table gmail-confluenceTable gmail-tablesorter gmail-tablesorter-default" style="border-collapse:collapse; margin:0px;overflow-x:auto;width:1200px"><tr>
               ${createTH("Name")}
                 ${createTH("Email")}
                 ${createTH("Phone")}
               ${createTH("ProductId")}
                ${createTH("Product")}
                 ${createTH("Cost")}
             ${createTH("Reduction")}
             ${createTH("Link")}
</tr>""","",
        "</table>")
}
Run Code Online (Sandbox Code Playgroud)

它接收通过 runReport 方法传递的数据并将其映射到适当的列。用我发送的数据创建一个表。

我需要能够在其中使用 python 方法,并且不能在 databricks 的 Scala 中调用 python 方法。

我已经开始转换它,但后来被困在如何使它像 scala 方法一样工作:

from dataclasses import dataclass

@dataclass
class runReport:
  name: str
  email: str
  phone: str
  productId: str
  product: str
  cost: float
  reduction: float
        
def runReport(runReport):
Run Code Online (Sandbox Code Playgroud)

编辑:所以从尝试的东西。我想我唯一需要做的就是弄清楚如何在 python 中完成这部分:

 return elements.map {
        case resultsOfReport (name, email, phone, productId, product, cost, stillInStock)
         => s"""<tr>${createTD(name)}${createTD(email)}${createTD(phone)}${createTD(productId)}${createTD(product)}${createTDDouble(cost)}${createTDDouble(reduction)}${createTheLink(productId)}${createTD("Link to product")}</tr>"""
      }.mkString(s"""<table class="gmail-relative-table gmail-confluenceTable gmail-tablesorter gmail-tablesorter-default" style="border-collapse:collapse; margin:0px;overflow-x:auto;width:1200px"><tr>
               ${createTH("Name")}
                 ${createTH("Email")}
                 ${createTH("Phone")}
               ${createTH("ProductId")}
                ${createTH("Product")}
                 ${createTH("Cost")}
             ${createTH("Reduction")}
             ${createTH("Link")}
</tr>""","",
        "</table>")
Run Code Online (Sandbox Code Playgroud)

例如,数据以 [Row(Name='name'等形式出现。需要知道如何将这些 Row 键值映射到列标题,因为它在上面的 Scala 中。

编辑:

预期输入:

data = spark.sql("select * from test") 
Run Code Online (Sandbox Code Playgroud)

来自 sql 示例数据框的数据:

姓名=jon,email=email.com,电话=324234,productId=1234,product=new,cost=500,stillInStock=y)

在 Scala 中调用上面编写的 resultsOfReport 方法:

html_returned=resultsOfReport(data)
Run Code Online (Sandbox Code Playgroud)

预期的输出会给我 html 格式,正如我上面在 Scala 中给出的那样。

bla*_*hop 5

我想这是很简单的第一功能转化为自己的Python的等价物:create_tdcreate_td_doublecreate_the_linkcreate_th

函数runReport可以写成如下。您可以使用该类型,List[Row]因为您不能像在 Scala 中将 DataFrame 转换为 dataclass 到 case class:

from typing import List
from pyspark.sql.types import Row

def run_report(elements: List[Row]) -> str:
    table_header = f"""<table class="gmail-relative-table gmail-confluenceTable gmail-tablesorter gmail-tablesorter-default" style="border-collapse:collapse; margin:0px;overflow-x:auto;width:1200px"><tr>
                   {create_th("Name")}
                   {create_th("Email")}
                   {create_th("Phone")}
                   {create_th("ProductId")}
                   {create_th("Product")}
                   {create_th("Cost")}
                   {create_th("Reduction")}
                   {create_th("Link")}</tr>"""

    tables_tds = [
        f"""<tr>{create_td(el.name)}{create_td(el.email)}{create_td(el.phone)}{create_td(el.productId)}{create_td(el.product)}{create_td_double(el.cost)}{create_td_double(el.reduction)}{create_the_link(el.productId)}{create_td("Link to product")}</tr>"""
        for el in elements
    ]

    return table_header + "".join(tables_tds) + "</table>"
Run Code Online (Sandbox Code Playgroud)

使用它:

data = spark.sql("select * from test").collect()
html_returned = run_report(data)
Run Code Online (Sandbox Code Playgroud)

请注意,collect不应将其用于大型 DataFrame(我认为对于此用例而言它不是很大)。