Строковое средство форматирования SQL [закрывается]

Расширение по спектному ответу. С поддержкой типов массивов:

object DataFrameUtils {

  private def dropSubColumn(col: Column, colType: DataType, fullColName: String, dropColName: String): Option[Column] = {
    if (fullColName.equals(dropColName)) {
      None
    } else if (dropColName.startsWith(s"$fullColName.")) {
      colType match {
        case colType: StructType =>
          Some(struct(
            colType.fields
              .flatMap(f =>
                dropSubColumn(col.getField(f.name), f.dataType, s"$fullColName.${f.name}", dropColName) match {
                  case Some(x) => Some(x.alias(f.name))
                  case None => None
                })
              : _*))
        case colType: ArrayType =>
          colType.elementType match {
            case innerType: StructType =>
              Some(struct(innerType.fields
                .flatMap(f =>
                  dropSubColumn(col.getField(f.name), f.dataType, s"$fullColName.${f.name}", dropColName) match {
                    case Some(x) => Some(x.alias(f.name))
                    case None => None
                  })
                : _*))
          }

        case other => Some(col)
      }
    } else {
      Some(col)
    }
  }

  protected def dropColumn(df: DataFrame, colName: String): DataFrame = {
    df.schema.fields
      .flatMap(f => {
        if (colName.startsWith(s"${f.name}.")) {
          dropSubColumn(col(f.name), f.dataType, f.name, colName) match {
            case Some(x) => Some((f.name, x))
            case None => None
          }
        } else {
          None
        }
      })
      .foldLeft(df.drop(colName)) {
        case (df, (colName, column)) => df.withColumn(colName, column)
      }
  }

  /**
    * Extended version of DataFrame that allows to operate on nested fields
    */
  implicit class ExtendedDataFrame(df: DataFrame) extends Serializable {
    /**
      * Drops nested field from DataFrame
      *
      * @param colName Dot-separated nested field name
      */
    def dropNestedColumn(colName: String): DataFrame = {
      DataFrameUtils.dropColumn(df, colName)
    }
  }

}
40
задан Paul D. Eden 25 December 2008 в 04:35
поделиться

4 ответа

http://www.sqlinform.com/

Этот инструмент переформатировал код SQL. Я использовал его с потрясающими результатами. Это свободно как веб-приложение и имеет загружаемую версию также.

5
ответ дан GluedHands 23 September 2019 в 16:34
поделиться

Эти хорошие взгляды.

http://www.sqlinform.com/

также существует это.

http://www.wangz.net/cgi-bin/pp/gsqlparser/sqlpp/sqlformat.tpl

1
ответ дан Jeff Atwood 23 September 2019 в 16:34
поделиться

Не то, чтобы я рекомендую потратить (относительно большие) деньги на него для просто этой цели, но Жабе создали функцию в этом, делает точно, что Вы желаете.

Это включает набор опций, разрешающих Вам настраивать точно, как Вы хотите свой отформатированный SQL (все столбцы на отдельных строках, и т.д.). Довольно хороший, но только если Вы уже получили Жабу. Я знаю, что версия Oracle делает это, но я принял бы SQL Server, или другие версии будут также.

0
ответ дан BQ. 23 September 2019 в 16:34
поделиться

Мне нравится использовать http://www.dpriver.com - это прекрасное дополнение к SQL Server Management Studio.

3
ответ дан 27 November 2019 в 01:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: