java — Как определить, является ли строка числом?
В связи с повышенным интересом по данному вопросу, сделал маленькое исследование 🙂
Полный код доступен тут.
В исследовании принимали участия классы:
CharacterDelegator() // код @Sergey ComplexMatcher() // код @VladD NumberUtilsDelegator() // мой код SimpleMatcher() // код @ivkremer (для простых чисел) GuavaDelegator() // код @Nofate♦ SimpleMatcherWithDot() // код @ivkremer (для чисел с точкой) SimpleParser() // оригинальный код от @pol GuavaComplexDelegator() // модифицированный вариант кода @Nofate♦ для Float InnerSetImpl() // мой специфический вариант
(@VladD, извиняюсь, понимаю, что делает ваш регэксп, но завести его у меня не получилось)
Тестовые данные:
{"1", "1.1", "1.11", "1.0", "-1", "-1.0", "-1.1", "4563575687468353456", "1l", "1L", "1f", "1F", "0xCAFEBABE", "1F", "10000000000000000000000000000000000000000000000000", "1.26767E108"}
Вывода много, поэтому вкратце:
- абсолютно все строки из примера распарсил только NumberUtils (commons-lang)
- вариант с использованием Guava (расширенный) справился со всем кроме long-нотаций («l») и «0xCAFEBABE» 🙂 (честно, не понимаю, почему он варианты с «f»-нотацией прожевал)
- остальные варианты в большей степени рассчитаны на парсинг именно интов, хотя в изначальном вопросе об этом ни слова 🙂
А вот самое интересное — это время работы данного кода.
Start performance test for core.impl.CharacterDelegator Ints: 125ms Numbers: 67ms Numbers with 25% errors: 50ms Small Ints: 43ms
Start performance test for core.impl.ComplexMatcher Ints: 10825ms Numbers: 11134ms Numbers with 25% errors: 10606ms Small Ints: 10380ms
Start performance test for core.impl.InnerSetImpl Ints: 50ms Numbers: 52ms Numbers with 25% errors: 54ms Small Ints: 42ms
Start performance test for core.impl.NumberUtilsDelegator Ints: 111ms Numbers: 91ms Numbers with 25% errors: 99ms Small Ints: 51ms
Start performance test for core.impl.SimpleMatcher Ints: 1072ms Numbers: 853ms Numbers with 25% errors: 847ms Small Ints: 766ms
Start performance test for core.impl.GuavaDelegator Ints: 131ms Numbers: 108ms Numbers with 25% errors: 124ms Small Ints: 119ms
Start performance test for core.impl.SimpleMatcherWithDot Ints: 3069ms Numbers: 5855ms Numbers with 25% errors: 5484ms Small Ints: 2548ms
Start performance test for core.
Start performance test for core.impl.GuavaComplexDelegator Ints: 980ms Numbers: 943ms Numbers with 25% errors: 1016ms Small Ints: 837ms
Тест построен следующим образом
Генерируем 2 рандомных списка со стрингами (числа). Тут есть 4 варианта:
1. Просто Инты. 2. Числа (с 50% вероятностью в стринге есть точка). 3. Числа с возможной ошибкой (25% что в строке есть подстрока "error"). 4. Набор Интов в небольшом диапазоне.
Делаем тестовый прогон на 10_000 элементах.
- Делаем прогон на 1_000_000 элементах.
Из приведенных выкладок видно, что NumberUtils работает быстрее всего. Схожее время работы у простого варианты Guava`ы и простых regexp. Даже добавление простой точки значительно замедляет код. Также замечу, что код @Sergey работает очень быстро, но он рассчитан на проверку строго интов.
А еще есть мой специфический пример InnerSetImpl
. Он основан на допущении, что у нас есть ограниченное число возможных вариантов (то есть, мы можем и готовы держать их в памяти). Тогда мы просто помещаем их в HashSet и проверяем наличие строк в нем. Собственно, такой вариант самый быстрый, но допущение многое портит 🙂
ИТОГО: если нужно простое и элегантное решение — то лучше всего воспользоваться NumberUtils.isNumber(str)
и не париться.
А если вдруг у вас стоит специфическая задача на парсинг не просто чисел, но чисел в Java-нотациях, то это единственный полностью рабочий вариант.
(Все вышесказанное относится только к приведенному коду. Я не исключаю, что можно придумать (или даже существует) более правильное или более быстрое решение).
Spark Преобразование строкового типа в целочисленный тип (int)
- Автор сообщения: Naveen (NNK)
- Категория сообщения: Apache Spark
- Последнее изменение сообщения: 20 февраля 2023 г.
Распространяйте любовь
В Spark SQL, чтобы преобразовать/преобразовать строковый тип в целочисленный тип (int), вы можете использовать функцию cast()
класса Column, используйте эту функцию с withColumn(), select(), selectExpr() и выражением SQL. Эта функция принимает строку аргумента, представляющую тип, который вы хотите преобразовать, или любой тип, который является подклассом DataType.
Ключевые моменты
Преобразование строки в целое число в Java
Включите JavaScript
Преобразование строки в целое число в Java-
cast()
016 Столбец класса, который используется для преобразования столбца в другой тип данных. - Когда Spark не может преобразовать в определенный тип, функция cast() возвращает нулевое значение.
- Эта функция принимает строку аргумента, представляющую тип, который вы хотите преобразовать, или любой тип, являющийся подклассом DataType.
- Spark SQL использует другой синтаксис
для приведения типов.
Ниже приведены некоторые примеры Spark, которые изменяют/преобразуют строковый тип в целочисленный тип (int).
импортировать org.apache.spark.sql.functions.col импортировать org.apache.spark.sql.types.IntegerType // Преобразование строки в целочисленный тип df.withColumn («зарплата», col («зарплата»). Cast (IntegerType)) df.withColumn («зарплата», col («зарплата»). Cast («int»)) df.withColumn («зарплата», col («зарплата»). Cast («целое число»)) // Использование выбора df.select(col("зарплата").cast("int").as("зарплата")) //Использование selectExpr() df.selectExpr("приведение(зарплата как int) зарплата","isGraduated") df.selectExpr("INT(зарплата)","isGraduated") // Использование с spark.sql() spark.sql("SELECT INT(зарплата),BOOLEAN(isGraduated),пол из CastExample") spark.sql («ВЫБЕРИТЕ приведение (зарплата как int) зарплата, BOOLEAN (isGraduated), пол из CastExample»)
1.
Настройка DataFrameДавайте рассмотрим несколько примеров.
val искра = SparkSession.builder .мастер("местный[1]") .appName("SparkByExamples.com") .getOrCreate() val simpleData = Seq(("Джеймс",34,"истина","М","3000,6089"), («Майкл», 33 года, «правда», «Ж», «3300,8067»), («Роберт», 37, «ложь», «М», «5000,5034») ) импортировать spark.implicits._ val df = simpleData.toDF («имя», «возраст», «окончил», «пол», «зарплата») df.printSchema()
Выходы ниже схемы. Обратите внимание, что столбец оклад
является строковым типом.
2. withColumn() — преобразование строки в целочисленный тип
Сначала будет использоваться Spark DataFrame withColumn() для преобразования столбца оклада
из строкового типа в целочисленный тип , это преобразование withColumn() принимает имя столбца, которое вы хотели для преобразования в качестве первого аргумента, а для второго аргумента необходимо применить метод cast() cast()
.
импортировать org.apache.spark.sql.functions.col импортировать org.apache.spark.sql.types.IntegerType // Преобразование строки в целочисленный тип val df2 = df.withColumn («зарплата», col («зарплата»). Cast (IntegerType)) df2.printSchema() df2.show()
Выводы ниже схемы и кадра данных.
Кроме того, вы также можете изменить тип данных, используя приведенную ниже информацию.
df.withColumn («зарплата», col («зарплата»). Cast («int»)) df.withColumn («зарплата», col («зарплата»). Cast («целое число»))
3. Использование select() Пример
В следующем примере используется преобразование selectExpr() SataFrame для изменения типа данных.
// Использование выбора df.select(col("зарплата").cast("int").as("зарплата")).printSchema() //Использование selectExpr() df.selectExpr("приведение (зарплата как int) зарплата").printSchema()
4. Использование Spark SQL — приведение строки к целочисленному типу
Выражение Spark SQL предоставляет функции типа данных для приведения, и мы не можем использовать функцию cast()
. Ниже INT (строковое имя столбца)
используется для преобразования в целочисленный тип.
df.createOrReplaceTempView("CastExample") df4=spark.sql("SELECT firstname,age,isGraduated,INT(salary) as pay from CastExample")
5. Заключение
В этой простой статье Spark я рассказал, как преобразовать столбец DataFrame из строкового типа в целочисленный с помощью функции cast() и применить ее с помощью withColumn(), select(), selectExpr() и, наконец, Спарк SQL-таблица.
Счастливого обучения!!
Теги: cast, select(), selectExpr
SparkByExamples.com — это страница сообщества примеров больших данных и Spark, все примеры просты и понятны и хорошо протестированы в нашей среде разработки Подробнее .
Преобразование строковых или числовых значений времени в формат даты — ArcGIS Pro
Рекомендуется сохранять значения времени временных данные в поле даты. Поле даты — это тип поля базы данных. специально для хранения информации о времени и дате.
Если у вас есть значения времени, хранящиеся в строковом или числовом (коротком, длинном, плавающем или двойном) поле, вы можете преобразовать их в поле даты с помощью инструмента геообработки Преобразовать поле времени. Используйте этот инструмент, чтобы указать стандартный или пользовательский формат времени для интерпретации значений даты и времени и преобразования их в формат даты.
Стандартные форматы поддерживаются инструментом Convert Time Field. Однако если у вас есть значения времени, хранящиеся в строковом поле с использованием пользовательского формата даты и времени, вы можете создать собственный формат даты и времени для интерпретации ваших данных. Например, при использовании инструмента «Преобразовать поле времени» для преобразования значения времени вторник, 20 августа 2002 г., сохраненного в виде строки, в формат даты, укажите входной формат времени как дддд, мммм дд, гггг.
- При использовании инструмента Преобразование поля времени список стандартных поддерживаемых форматов времени ввода зависит от того, хранятся ли значения времени ввода в строковом или числовом (коротком, длинном, плавающем или двойном) поле.
- Инструмент «Преобразовать поле времени» позволяет задавать пользовательские форматы даты и времени только в том случае, если значения времени хранятся в строковом поле. Пользовательские форматы даты и времени не поддерживаются, если значения времени хранятся в числовых полях.
Строки формата даты и времени
Строка формата даты и времени содержит информацию о дате и времени в согласованном формате. Каждая строка формата состоит из комбинации форматов доступного типа формата. Некоторыми примерами типов формата являются день недели, месяц, час и секунда. В одной строке формата даты и времени следует использовать только один формат из каждого типа формата. Однако не каждый тип формата необходимо включать в строку формата. Например, обычно определяют строку формата даты, содержащую только информацию о годе, месяце и дне месяца, без включения какой-либо информации о времени суток.
Строка формата может содержать только информацию о времени, только информацию о дате или комбинацию информации о дате и времени. Строки формата могут также включать разделители, такие как запятые, которые разделяют форматы, используемые в строке формата.
Вам необходимо проанализировать свои данные, чтобы определить соответствующую строку формата даты и времени для интерпретации ваших данных. В следующих примерах показаны различные строки формата для интерпретации даты и времени:
Примеры строк формата даты и времени
Пример значения данных | Строка формата | ||
---|---|---|---|
30.05.1978 02:34:56 | дд/мм/гггг ЧЧ:мм:сс | ||
04. 02.2010 14:39:28 | М/д/гггг ч:мм:сс тт | ||
6:05:12 90 147 | ч:мм:сс тт | ||
23:31:18.345 | ЧЧ:мм:сс.с | ||
Вторник, 20 августа 2002 г. | ддд, МММ дд, гггг | ||
Ср, 31 августа 1994 | ддд, МММ дд г гггг | ||
0328199 56 | ММддггггЧЧммсс |
Спецификатор формата | Тип формата | Описание |
---|---|---|
d | День месяца | День месяца цифрами без начальный нуль для одноразрядных дней. |
дд | День месяца | День месяца в виде цифр с нулем в начале для однозначных дней. |
ддд | День недели | День недели в виде трехбуквенной аббревиатуры. Функция использует сокращения, связанные с указанным языковым стандартом, например Mon на английском языке (США). Совет:Дни недели не проверяются при интерпретации значения даты; поэтому не имеет значения, правильно ли день недели, указанный в ваших данных, соответствует дате, представленной в значении данных. |
дддд | День недели | Полное название дня недели. Функция использует названия полных дней, связанные с указанным языковым стандартом, например, Monday на английском языке (США). Совет:Дни недели не проверяются при интерпретации значения даты; поэтому не имеет значения, правильно ли день недели, указанный в ваших данных, соответствует дате, представленной в значении данных. |
M | Месяц | Месяц в виде цифр без начального нуля для однозначных месяцев. |
MM | Месяц | Месяц в виде цифр с нулем в начале для однозначных месяцев. |
МММ | Месяц | Месяц как трехбуквенное сокращение. Функция использует аббревиатуры месяцев, связанные с указанным языковым стандартом, например, Nov на английском языке (США). |
MMMM | Месяц | Месяц как его полное название. Функция использует полные названия месяцев, связанные с указанным языковым стандартом, например, ноябрь для английского языка (США) и noviembre для испанского языка (Испания). |
г | Год | Год с двумя последними цифрами, но без начального нуля для лет, последние две цифры которых меньше 10. Совет:Годы, представленные таким образом, могут варьироваться от 1950 до 2049. Значение 49 или меньше интерпретируется как 21 век, например, 7 интерпретируется как 2007. Значение 50 или больше интерпретируется например, 67 интерпретируется как 1967 год. s, но с начальным нулем для лет, последние две цифры которых меньше 10, Совет:Годы, представленные таким образом, могут находиться в диапазоне от 1950 до 2049. Значение 49 или меньше интерпретируется как 21 век. Например, 07 интерпретируется как 2007 год. Значение 50 или более интерпретируется как 20-й век, например, 67 интерпретируется как 1967 год. |
гггг | Год | Год представлен только тремя цифрами. Годы, представленные таким образом, могут варьироваться от 1 до 9.99. |
гггг | Год | Год представлен четырьмя цифрами. |
гг | Эра | Строка периода/эры. Функция использует значения эры, связанные с указанным языковым стандартом. |
T | Разделитель времени | Разделитель, который объединяет предшествующее значение даты и последующее значение времени. Эта функция обычно используется в форматах ISO. |
ч | Час | Час без начального нуля для однозначных часов; 12-часовые часы. |
H | Час | Час без начального нуля для однозначных часов; 24-часовые часы. |
чч | Час | Часы с нулем в начале для однозначных часов; 12-часовые часы. |
ЧЧ | Час | Часы с нулем в начале для часов с одной цифрой; 24-часовые часы. |
м | Минуты | Минуты без начального нуля для минут с одной цифрой. |
мм | Минуты | Минуты с нулем в начале для минут с одной цифрой. |
с | Секунды | Секунды без начального нуля для одноразрядных секунд. |
ss | Секунда | Секунды с начальным нулем для одноразрядных секунд. |
s.s. | Секунды | Секунды, включая доли секунды, без начального нуля для одноразрядных секунд. Хотя формат показывает только один десятичный разряд, можно использовать любое количество десятичных разрядов. Внимание:Точность значений долей секунды ограничена тем, что поддерживается для типа данных поля времени. Например, при использовании поля времени с типом данных поля float или double следует ожидать ошибок округления. |
ss.s | Секунды | Секунды, включая доли секунды, с нулем в начале для однозначных секунд. Хотя формат показывает только один десятичный разряд, можно использовать любое количество десятичных разрядов. Внимание:Точность значений долей секунды ограничена тем, что поддерживается для типа данных поля времени, например, при использовании поля времени типа данных поля float или double следует ожидать ошибок округления. |
t | Маркер времени | Строка маркера времени, состоящая из одного символа, например A или P. | tt | Маркер времени | Многосимвольная строка маркера времени, например, AM или PM. |
z | Обозначение часового пояса | Этот суффикс указывает, что значение времени указано в формате всемирного координированного времени (UTC). Эта функция обычно используется в форматах ISO. |
Разделители
Разделители — это символы, разделяющие информацию в значениях текстовых данных. Примерами часто используемых разделителей являются запятые (,), двоеточия (:) и пробелы ( ), но нет никаких ограничений на разделители, которые можно использовать для создания строк формата. Вы можете создавать строки формата вообще без каких-либо разделителей, особенно при интерпретации дат и времени, хранящихся в числовых полях, поскольку числовые поля не могут хранить большинство часто используемых символов-разделителей.
В редких случаях данные могут содержать разделители, противоречащие формату, указанному в таблице выше. В этих случаях необходимо использовать одинарные кавычки, чтобы изолировать разделители в строке формата. Как правило, одинарные кавычки можно использовать для изоляции любых разделителей в строке формата, но не рекомендуется использовать их, если нет потенциального конфликта. Эти концепции показаны в следующих примерах:
Пример значения данных | Формат | Интерпретация даты или времени (отображается в формате ММ/дд/гггг или ЧЧ:мм:сс) |
---|---|---|
месяц22день30год2010 | 901 4430.12.2010 | |
30.12.2010 | ддммгггг | 90 013 30.12.2010 |
Время:18ч6мин3сек | ‘Время:’ч ‘ч’м’мин’сек’ | 18:06:03 |
18:6:3 | ЧЧ:м:с | 9001 3 18:06:03 |
Языки
Языки важны потому что они определяют действительные значения данных для длинного представления некоторых форматов даты в таблице выше. Например, значение Ноябрь правильно интерпретируется для ММММ только в том случае, если локаль является англоязычной локалью. В некоторых случаях, если в строке формата не используются длинные представления, локаль не имеет значения для интерпретации даты, но локаль может повлиять на интерпретацию обозначений AM и PM. Если обозначения AM или PM не указаны, используются обозначения AM и PM по умолчанию для локали.
Локали не влияют на форматы, используемые для создания строк формата. Например, символ М (или ММ, МММ, ММММ) представляет месяцы независимо от локали. В следующих примерах показано, как локаль используется для интерпретации дат:
Значение данных | Строка формата | Локаль | Дата интерпретации (MM /дд/гггг) |
---|---|---|---|
30 ноября 2010 г. | MMMM dd, yyyy | Английский (США) | 30.11.2010 |
Noviembre 30, 2010 | ММММ дд, гггг | Испанский (Испания) | 30.11.2010 |
Пн, 22 февр. 2010 г. | ддд, МММ дд, гггг | Английский (США) | 22. 02.2010 |
30/12/2010 | дд/м/гггг | Все регионы | 12/ 30/2010 |
Обозначения AM и PM
Маркеры стандартного времени, или обозначения AM и PM существуют для каждой локали. Однако вы можете определить свои собственные маркеры времени. Если в вашей строке формата существуют маркеры времени (t или tt), необходимо определить символы, используемые для представления маркеров времени. Маркеры времени подходят только для использования со строками формата, использующими 12-часовой формат времени (ч или чч). Они не подходят для строк формата, использующих 24-часовой формат времени (Ч или ЧЧ). Если вы не зададите свои собственные маркеры времени, будут использоваться стандартные маркеры времени для выбранной локали. Чтобы определить ваши собственные обозначения AM и PM, поле времени должно иметь текстовый тип данных поля. В следующих примерах эти концепции показаны с использованием только обозначения РМ для простоты. Те же принципы применимы к обозначению AM:
Значение данных | Строка формата | Обозначение PM | Интерпретируемое время (ЧЧ:мм:сс) 9013 7 |
---|---|---|---|
6:12:34 P | ч: мм:сс t | P | 18:12:34 |
18:12:34 | ч:мм:сс тт | п. |